JSplitPlaneクラスを使うと、パネル内部品を分割できてその区分けした範囲は、
ドラックでスライドすることにより、大きさが変更できます。
このドラックできる部分は
ディバイダ(divider:「区切るもの」を意味)と呼びます。
下記の実行例では、JSplitPlaneで上下に分けて、上部をさらに左右に分けています。
そして左右にJToggleButton、下部にJTextAreaを配置した例です。
トグルボタンは、両方とも初期を押された状態にしてあります。
左のトグルボタンは、左右に分割しているディバイダをドラックで可能な状態にしています。
右のトグルボタンは、上下に分割しているディバイダをドラックで可能な状態にしています。
ボタンをポップさせると、ディバイダは移動できなくなります。
再びクリックすると、また移動できるようになります。
import java.awt.*;//BorderLayoutなどのパッケージ用 import java.awt.event.*;//ActionListenerなどのパッケージ用 import javax.swing.*;//JPanelなどのパッケージ用 class MainPanel extends JPanel implements ActionListener { JSplitPane splitH = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);//水平軸を左右に分ける JSplitPane splitV = new JSplitPane(JSplitPane.VERTICAL_SPLIT);//垂直軸を上下に分ける JToggleButton toggleBtnH = new JToggleButton("移動可能→", true); JToggleButton toggleBtnV = new JToggleButton("移動可能↓", true); JTextArea textArea = new JTextArea("こんにちは\n Hello\n\n編集可能なテキストエリアで。"); public MainPanel() { this.setLayout(new BorderLayout()); splitH.add(toggleBtnH, JSplitPane.LEFT);//左に配置 splitH.add(toggleBtnV, JSplitPane.RIGHT);//右に配置 splitH.setDividerSize(50); // ディバイダのサイズを50ピクセルに設定します。 splitH.setDividerLocation(200);//左ボタンの幅指定 splitV.add(splitH, JSplitPane.TOP);//上に配置 splitV.add(textArea, JSplitPane.BOTTOM);//下に配置 splitV.setDividerLocation(50);//上部の高さ指定になる this.add(splitV, BorderLayout.CENTER);//パネルに配置 toggleBtnH.addActionListener(this);//ボタンアクションの登録 toggleBtnV.addActionListener(this); } public void actionPerformed(ActionEvent e) { JToggleButton btn = (JToggleButton)e.getSource(); if (btn == this.toggleBtnH) { if (btn.isSelected()) splitH.setEnabled(true);//スライダを固定 else splitH.setEnabled(false);//スライダを可動 } else { if (btn.isSelected()) splitV.setEnabled(true); else splitV.setEnabled(false); } } } class TestFrame extends JFrame { MainPanel panel = new MainPanel(); public TestFrame() {//コンストラクタ this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.getContentPane().add(panel, BorderLayout.CENTER); this.setSize(400, 300); this.setVisible(true); } } public class TestSplitePane extends JApplet {//アプレット時 MainPanel panel = new MainPanel(); public TestSplitePane() {//コンストラクタ this.getContentPane().add(panel, BorderLayout.CENTER); } public static void main(String[] args) {//ローカル起動時 new TestFrame(); } public void newTestFrame() { new TestFrame(); } }