部品の配置

まずは、部品を配置しているだけのプログラム Simple0 をみてみましょう。

このプログラムは、以下のような画面を表示するだけのプログラムです。

Simple0の絵

プログラムでやることは、

  • ウィンドウを作成し、
  • ウィンドウのタイトルやサイズを設定し、“x"印が押されたときの挙動を指定し、
  • ボタンやテキスト領域を、ウィンドウの画面領域に生成・配置する

だけです。とはいえ、プログラムとしてみると結構長いです。GUIツールとかあるので、まじめに見なくても大丈夫ですよ。

public class Simple0 extends JFrame {

    private static final long serialVersionUID = 1L;
    JPanel pane; // ウィンドウの(メニューバーなどでない)本体部分。
    JButton button;          // ボタン一つ
    JTextField text0, text1; // テキストフィールド2つ
    
    public Simple0() {
        super();
        initialize();  // なんとなく、別メソッドに分けてみただけ
    }
    
    void initialize() {
        setTitle("Simple0"); // ウィンドウタイトルをつけて
        setSize(300, 200);   // サイズをつけて
        // "x"印をおされたら、Frameを終了して
        setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
        
        button=new JButton();  // ボタン生成と、テキスト・サイズ設定
        button.setText("Push Here!");
        button.setPreferredSize(new Dimension(100, 50));
        text0=new JTextField(); // テキストフィールドを作成
        text0.setPreferredSize(new Dimension(300, 50));
        text1=new JTextField(); // テキストフィールドをもう一つ。
        text1.setPreferredSize(new Dimension(300,50));
        
        pane = new JPanel(); // ウィンドウ本体部分を作成
        // レイアウト設定(上から順に並べるレイアウト)
        pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); 
        pane.add(button);  // ボタンを一番上に
        pane.add(text0);   // 次にtext0を
        pane.add(text1);   // 最後に text1を
        this.setContentPane(pane); // pane を JFrameに登録
    }
    
    public static void main(String[] args) {
        // 詳しくは、次回以降解説するが、
        // main から GUI に仕事を依頼するときは、invokeLater 
        // (後でやっといてね指示)を使うのが流儀。
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Simple0 frame = new Simple0(); // 生成して
                frame.setVisible(true);        // 表示する
            }
        });
    }
}

ポイント

  • javax.swing.JFrameContentPane として Panel を作成
  • javax.swing.JButton, javax.swing.JTextField を作成し、そのサイズを指定してから、ContentPane の内部要素に登録。
  • ContentPane には、layot manager を設定しておく
  • main から Frame を作成する際は、SwingUtilities.invokeLater() を実行
    • interface Runnable 中に、実行して欲しい内容を記述

というあたりです。

階層構造的には、こんな感じ。

simple0inside.png