仕切線(ディバイダ)の初期位置と移動可能範囲

広告

分割された領域にコンポーネントを配置した場合に仕切線が表示される初期位置について確認します。

仕切線の初期位置は左側(上下に分割した場合は上側。以下同様)に配置されたコンポーネントの推奨サイズで調整されます。左側のコンポーネントが推奨サイズになった時にピッタリ入る位置にセパレータは表示されます。

また仕切線はコンポーネントの最小サイズの位置まで移動が行えます。

最小サイズとはコンポーネントに対して「getMinimumSize」メソッドを実行した時に返されるサイズです。コンポーネントには推奨サイズの他に最大サイズと最小サイズがありますが、コンポーネントが作成された時に推奨サイズと最小サイズは同じ値に設定されます。

次の簡単なサンプルで試してみます。

JSplitPaneTest4.java

import javax.swing.*;
import java.awt.Dimension;
import java.awt.BorderLayout;

public class JSplitPaneTest4 extends JFrame{

  public static void main(String[] args){
    JSplitPaneTest4 frame = new JSplitPaneTest4();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  JSplitPaneTest4(){
    JSplitPane splitpane = new JSplitPane();

    JPanel leftPanel = new JPanel();
    JButton leftButton = new JButton("Left");
    leftPanel.add(leftButton);

    Dimension pre = leftPanel.getPreferredSize();
    Dimension max = leftPanel.getMaximumSize();
    Dimension mix = leftPanel.getMinimumSize();
    System.out.println("左側コンポーネント");
    System.out.println("推奨:(" + pre.width + "," + pre.height + ")");
    System.out.println("最大:(" + max.width + "," + max.height + ")");
    System.out.println("最小:(" + mix.width + "," + mix.height + ")");

    JPanel rightPanel = new JPanel();
    JButton rightButton = new JButton("Right");
    rightPanel.add(rightButton);

    pre = rightPanel.getPreferredSize();
    max = rightPanel.getMaximumSize();
    mix = rightPanel.getMinimumSize();
    System.out.println("右側コンポーネント");
    System.out.println("推奨:(" + pre.width + "," + pre.height + ")");
    System.out.println("最大:(" + max.width + "," + max.height + ")");
    System.out.println("最小:(" + mix.width + "," + mix.height + ")");

    splitpane.setLeftComponent(leftPanel);
    splitpane.setRightComponent(rightPanel);

    getContentPane().add(splitpane, BorderLayout.CENTER);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

JSplitPaneで仕切線の初期位置と移動範囲

また次のように左側に配置されているパネルの推奨サイズ、最大サイズ、最小サイズが標準出力に表示されます。

左側コンポーネント
推奨:(66,36)
最大:(32767,32767)
最小:(66,36)
右側コンポーネント
推奨:(73,36)
最大:(32767,32767)
最小:(73,36)

仕切線は左側に配置されているコンポーネントの推奨サイズの幅の位置に初期位置が設定されます。今回の場合で言えば仕切線は左端から66ピクセルの位置に表示されています。

JSplitPaneで仕切線の初期位置と移動範囲

推奨サイズと最小サイズの値が同じですので仕切線はこの初期位置よりも左側に移動させることは出来ません。

また仕切線は右側コンポーネントの最小サイズの幅の位置まで右側へ移動させることが出来ます。今回の場合では推奨サイズと最小サイズが同じですのでちょうど右側のコンポーネントがぴったり収まる位置まで移動できます。

JSplitPaneで仕切線の初期位置と移動範囲

今回の場合は右端から73ピクセルの位置まで仕切線を移動させることが出来ます。

JSplitPaneで仕切線の初期位置と移動範囲

仕切線の移動範囲の拡大

先ほど記載したとおり仕切線は左側及び右側コンポーネントの最小サイズの位置まで移動できます。コンポーネントはオブジェクトを作成時に推奨サイズと最小サイズの大きさが同じ値に設定される場合が多いため、特に設定しない場合には左側及び右側のコンポーネントよりも先に移動出来ません。

そこで各コンポーネントに最小サイズを明示的に設定し、仕切線が端まで左端及び右端まで移動出来るように設定してみます。

次の簡単なサンプルで試してみます。

JSplitPaneTest5.java

import javax.swing.*;
import java.awt.Dimension;
import java.awt.BorderLayout;

public class JSplitPaneTest5 extends JFrame{

  public static void main(String[] args){
    JSplitPaneTest5 frame = new JSplitPaneTest5();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  JSplitPaneTest5(){
    JSplitPane splitpane = new JSplitPane();

    JPanel leftPanel = new JPanel();
    JButton leftButton = new JButton("Right");
    leftPanel.add(leftButton);
    leftPanel.setMinimumSize(new Dimension(0,0));

    JPanel rightPanel = new JPanel();
    JButton rightButton = new JButton("Right");
    rightPanel.add(rightButton);
    rightPanel.setMinimumSize(new Dimension(0,0));

    splitpane.setLeftComponent(leftPanel);
    splitpane.setRightComponent(rightPanel);

    getContentPane().add(splitpane, BorderLayout.CENTER);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

JSplitPaneで仕切線の初期位置と移動範囲

最小サイズを明示的に設定してありますので仕切線は左側及び右側へ今まで以上に移動が出来ます。

JSplitPaneで仕切線の初期位置と移動範囲

JSplitPaneで仕切線の初期位置と移動範囲

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)