配置されるコンポーネントのサイズ調整について
BoxLayoutで配置されるコンポーネントは、コンポーネントの最大サイズである「getMaximumSize」メソッドで返されるサイズを最大としてコンテナ内に表示されます。最大サイズがコンテナのサイズよりも大きい場合はコンテナのサイズまで、最大サイズがコンテナのサイズよりも小さい場合は最大サイズで表示されます。
コンポーネントは作成時に推奨サイズ(「getPreferredSize」メソッドで返されるサイズ)と最大サイズが同じ値に設定されます。BoxLayoutを設定したコンテナ配置されるコンポーネントに対してサイズを指定したい場合にはJComponentクラスで用意されている「setgetMaximumSize」メソッドでコンポーネントの最大サイズを設定して下さい。
public void setMaximumSize(Dimension maximumSize)
このコンポーネントの最大サイズを定数値に設定します。getMaximumSize の以 降の呼び出しで、常にこの値を返します。その計算のためにコンポーネントの UI が要求されることはありません。最大サイズを null に設定すると、デフォ ルトの動作に戻ります。 パラメータ: maximumSize - 要求される最大許可サイズを保持する Dimension
引数にはコンポーネントのサイズを表すDimensionクラスのオブジェクトを指定します。Dimensionクラスについては『Dimensionクラス』を参照して下さい。
実際の使い方は次のようになります。
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
JButton button1 = new JButton("button1");
button1.setMaximumSize(new Dimension(100, 100));
p.add(button1);
なおコンテナいっぱいの大きさまでサイズを大きくしたい場合にはコンポーネントの最大サイズを非常に大きい値に設定しておいて下さい。どれだけ大きい値を設定してもコンテナに配置可能なサイズよりも大きくなることはありません。十分に大きい値として例えば「Short.MAX_VALUE」を設定しておきます。(Short.MAX_VALUEはShortクラスで定義されている値で32767です)。
サンプルプログラム
では簡単なサンプルを作成して試してみます。
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.BorderLayout;
public class BoxLayoutTest5 extends JFrame{
  public static void main(String[] args){
    BoxLayoutTest5 frame = new BoxLayoutTest5();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }
  BoxLayoutTest5(){
    JButton button1 = new JButton("Google");
    int height = button1.getMaximumSize().height;
    button1.setMaximumSize(new Dimension(Short.MAX_VALUE, height));
    JButton button2 = new JButton("Yahoo!");
    button2.setFont(new Font("Arial", Font.PLAIN, 30));
    JButton button3 = new JButton("MSN");
    JPanel p = new JPanel();
    p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
    p.add(button1);
    p.add(button2);
    p.add(button3);
    getContentPane().add(p, BorderLayout.CENTER);
  }
}
上記をコンパイルした後で実行すると次のように表示されます。
			 
			
今回は一番上のボタンの幅だけをコンテナいっぱいに広げました。高さは変更しないので設定前の高さを取得して同じ値を設定しています。
サンプルプログラム
もう一つサンプルを試してみます。今度は全てのボタンで幅も高さも十分大きい値に設定してみます。
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.BorderLayout;
public class BoxLayoutTest6 extends JFrame{
  public static void main(String[] args){
    BoxLayoutTest6 frame = new BoxLayoutTest6();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }
  BoxLayoutTest6(){
    JButton button1 = new JButton("Google");
    button1.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    JButton button2 = new JButton("Yahoo!");
    button2.setFont(new Font("Arial", Font.PLAIN, 30));
    button2.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    JButton button3 = new JButton("MSN");
    button3.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    JPanel p = new JPanel();
    p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
    p.add(button1);
    p.add(button2);
    p.add(button3);
    getContentPane().add(p, BorderLayout.CENTER);
  }
}
上記をコンパイルした後で実行すると次のように表示されます。
			 
			
高さの方は元のコンポーネントの高さなどを加味して3つのコンポーネントの高さが調整され、画面いっぱいに表示されます。
( Written by Tatsuo Ikura )
 
				著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。
