SwingのJPanelとJTabbed

Swing

スポンサーリンク

こんにちは。「Javaを復習する初心者」です。SwingのJPanelとJTabbedを使ってみました。

以下のソースを雛形として使います。

import javax.swing.JFrame;

public class Test extends JFrame {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);

    }

    private void init() {
        // 設置処理
    }

}

スポンサーリンク

JPanel

JPanelは汎用的なコンテナです。

FlowLayoutで3つ設置

JFrameのレイアウトマネージャーにFlowLayoutを指定し、JPanelを3つ配置して見ました。デフォルトコンストラクタを使いインスタンスを生成して、JFrameに追加しています。ただし、そのままだと透明で設置されているのかわからないため、境界線を引いています。境界線はsetBorder()メソッドを使って指定することができます。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        JPanel panel1 = new JPanel();
        panel1.setBorder(new LineBorder(Color.RED));
        add(panel1);

        JPanel panel2 = new JPanel();
        panel2.setBorder(new LineBorder(Color.BLUE));
        add(panel2);

        JPanel panel3 = new JPanel();
        panel3.setBorder(new LineBorder(Color.GREEN));
        add(panel3);
    }

FlowLayoutを指定しているので左から順番に設置されました。各JPanelには中身を設定していないので、何も表示されません。

JPanelにJButtonを追加

JPanelはadd()メソッドが使えます。このメソッドはContainerクラスのメソッドです。引数にComponentオブジェクトを指定します。JPanelはContainerクラスの子クラスです。

以下ではJButtonをいくつか追加してみました。

    private void init() {
        // 設置処理
        setLayout(new FlowLayout());

        JPanel panel1 = new JPanel();
        panel1.setBorder(new LineBorder(Color.RED));
        panel1.add(new JButton("ボタン1-1"));
        panel1.add(new JButton("ボタン1-2"));
        add(panel1);

        JPanel panel2 = new JPanel();
        panel2.setBorder(new LineBorder(Color.BLUE));
        panel2.add(new JButton("ボタン2-1"));
        panel2.add(new JButton("ボタン2-2"));
        panel2.add(new JButton("ボタン2-3"));
        add(panel2);

        JPanel panel3 = new JPanel();
        panel3.setBorder(new LineBorder(Color.GREEN));
        panel3.add(new JButton("ボタン3-1"));
        add(panel3);
    }

JPanelのレイアウトマネージャーは、初期値がFlowLayoutです。panel1.getLayout()をコンソールに出力してみた結果、以下のように表示されました。

java.awt.FlowLayout[hgap=5,vgap=5,align=center]

alignの値がcenterであるため、中央寄せです。JFrameのレイアウトマネージャーを初期値のままにして、JPanelを設置すると中央寄せの様子が分かります。

    private void init() {
        // 設置処理
        JPanel panel1 = new JPanel();
        panel1.setBorder(new LineBorder(Color.RED));
        panel1.add(new JButton("ボタン1-1"));
        panel1.add(new JButton("ボタン1-2"));
        panel1.add(new JButton("ボタン1-3"));
        panel1.add(new JButton("ボタン1-4"));
        panel1.add(new JButton("ボタン1-5"));
        add(panel1);
    }

JFrameのレイアウトマネージャーの初期値はBorderLayoutです。JPanelをaddメソッドでJFrameに追加しています。この場合、JPanelは中央に配置されます。配置したJPanelの高さと幅はJFrameと同じになるようです。そのため、JButtonが次の行に折り返されて配置されます。

この配置方法を変えるには、例えば、以下のように新しいFlowLayoutを設定します。

    private void init() {
        // 設置処理
        JPanel panel1 = new JPanel();
        panel1.setBorder(new LineBorder(Color.RED));
        panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel1.add(new JButton("ボタン1-1"));
        panel1.add(new JButton("ボタン1-2"));
        panel1.add(new JButton("ボタン1-3"));
        panel1.add(new JButton("ボタン1-4"));
        panel1.add(new JButton("ボタン1-5"));
        add(panel1);
    }

JButtonが左寄せで配置されます。2行目が左寄せで配置されているのが確認できます。

JTabbedPane

JTabbedPaneクラスではコンポーネントを切り替えるタブを持つコンポーネントです。addメソッドはいくつかありますが、次のメソッドが使いやすいと思います。

  • Component add(String title, Component component)

上記の第1引数はタブに表示する文字列で、第2引数はComponentオブジェクトを指定しますが、JPanelを指定するのが基本的だと思います。

タブを追加

以下ではJLabelとJPanelをタブの内容にしてみた例です。

2つ目のタブではタブの内容にJPanelを設定しています。そのJPanelにJButtonが追加されているのが分かります。

setTabLayoutPolicy

タブが画面内に収まらない場合の処理をsetTabLayoutPolicy()メソッドで設定することができます。

引数には以下の2つを指定することができます。

  • JTabbedPane.WRAP_TAB_LAYOUT
  • JTabbedPane.SCROLL_TAB_LAYOUT

JTabbedPaneにはprivateフィールドtabLayoutPolicyが定義されていて、その値を変更するメソッドがsetTabLayoutPolicy()メソッドです。API仕様書によると、tabLayoutPolicyの初期値はJTabbedPane.WRAP_TAB_LAYOUTです。

以下、タブを10個追加してみました。tabLayoutPolicyは変更していません。

    private void init() {
        // 設置処理
        JTabbedPane tabbedPane = new JTabbedPane();
        for (int i = 0; i < 10; i++) {
            String s = "タブ" + i;
            tabbedPane.add(s, new JLabel(s + "の内容です。"));
        }
        add(tabbedPane);
    }

JFrameの幅に収まらないところで折り返して表示されました。

次に上記のソースにSCROLL_TAB_LAYOUTの設定を1行追加して実行してみました。

    private void init() {
        // 設置処理
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        for (int i = 0; i < 10; i++) {
            String s = "タブ" + i;
            tabbedPane.add(s, new JLabel(s + "の内容です。"));
        }
        add(tabbedPane);
    }

左右矢印のアイコンが表示され、スクロールできるように表示されました。

スポンサーリンク

おすすめQAサイト

エンジニア特化型Q&Aサイト【teratail(テラテイル)】:
このサイトはプログラミング特化型のQAサイトです。ソースを見やすく整形させた状態で表示させることが出来ます。