Swing の BorderLayout
ボーダーレイアウト (BorderLayout) ではそれに含まれるコンポーネントを、 上下、右左、中央に配置します。
ボーダーレイアウトの指定
全てのコンテナのレイアウトのデフォルトは BorderLayout なので、 setLayout メソッドで明示的に BorderLayout を設定しなくてもボーダーレイアウトを利用可能です。
JFrame のコンテントペインなどのコンテナに対して、BorderLayout を明示的に指定するには、 次のように setLayout メソッドに BorderLayout オブジェクトを渡します。
setLayout(new BorderLayout(10,5));
ボーダーレイアウトによる配置方法
場所の指定の仕方は、「東西南北の4つと中央の計5つ」 という指定方法と、 「ページ開始と終わり(上下に相当)、行の開始と終わり(右または左。後述)、それと行の中央の計5つ」 という二通りの指定方法があります。
方法1:「東西南北の4つと中央の計5つ」
東西南北と中央で指定する方法は非常に単純です。
コンテナに、コンポーネントを add するときに、BorderLayout.NORTH、BorderLayout.SOUTH、・・・ などのパラメータを同時に渡すことで、 ボーダーレイアウトにおける場所を指定します。
上のスクリーンショットのプログラムのソースコードは次のとおりです。
import java.awt.BorderLayout; import java.awt.ComponentOrientation; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class LayoutTestBorder2 extends JFrame { public LayoutTestBorder2(){ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,300); setLayout(new BorderLayout(10,5)); Container contentPane = getContentPane(); contentPane.add( new JButton("1 - North"), BorderLayout.NORTH); contentPane.add( new JButton("2 - South"), BorderLayout.SOUTH); contentPane.add( new JButton("3 - West"), BorderLayout.WEST); contentPane.add( new JButton("4 - East"), BorderLayout.EAST); contentPane.add( new JButton("5 - Center"), BorderLayout.CENTER); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run(){ createAndShowGUI(); } }); } protected static void createAndShowGUI() { LayoutTestBorder2 frame = new LayoutTestBorder2(); frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); frame.setVisible(true); } }
方法2:「ページ開始と終わり、行の開始と終わり、それと行の中央の計5つ」
コンテナに、コンポーネントを add するときに、BorderLayout.PAGE_START、BorderLayout.PAGE_END、 BorderLayout.LINE_START、・・・ などのパラメータを同時に渡すことでも場所を指定できます。
上のスクリーンショットのプログラムのソースコードは次のとおりです。
import java.awt.BorderLayout; import java.awt.ComponentOrientation; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class LayoutTestBorder1 extends JFrame { public LayoutTestBorder1(){ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,300); setLayout(new BorderLayout(10,5)); Container contentPane = getContentPane(); contentPane.add( new JButton("1 - Page Start"), BorderLayout.PAGE_START); contentPane.add( new JButton("2 - Page End"), BorderLayout.PAGE_END); contentPane.add( new JButton("3 - Line Start"), BorderLayout.LINE_START); contentPane.add( new JButton("4 - Line End"), BorderLayout.LINE_END); contentPane.add( new JButton("5 - Center"), BorderLayout.CENTER); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run(){ createAndShowGUI(); } }); } protected static void createAndShowGUI() { LayoutTestBorder1 frame = new LayoutTestBorder1(); frame.setVisible(true); } }
例えば英語では、文章を上から下へ、左から右へ読むので、PAGE_START、PAGE_END はそれぞれ上 (NORTH)、下 (SOUTH) と同等に、 LINE_START、LINE_END はそれぞれ左 (WEST)、右 (EAST) と同等になります。
もしロケールが右から左へ読むように設定されている場合は、LINE_START、LINE_END はそれぞれ EAST、WEST と同等の意味になります。
実際に、次のように方向(オリエンテーション)を指定して試すと・・・
frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
このように、向きが変わります。
念のため言うと、オリエンテーションを右から左に変更しても、東西南北で指定したときはレイアウトは変わりません。
コンポーネントの配置を、ロケールによって変えたい場合はこの2番目の方法でレイアウトを指定すると良いでしょう。