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番目の方法でレイアウトを指定すると良いでしょう。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門