A と B の 2 つのコンポーネントを持つ JSplitPane がありますが、B を非表示にしたい場合があるため、次のいずれかが当てはまります。
- コンポーネント A と B は JSplitPane に表示されます
- コンポーネント A のみが JSplitPane が占有するスペースに表示されます
これを行う方法はありますか?
A と B の 2 つのコンポーネントを持つ JSplitPane がありますが、B を非表示にしたい場合があるため、次のいずれかが当てはまります。
これを行う方法はありますか?
一体、私は解決策を試みます...
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
final JPanel contentPane = (JPanel)frame.getContentPane();
final JButton leftBtn = new JButton("Left Button");
final JButton rightBtn = new JButton("Right Button");
final JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
leftBtn, rightBtn);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton source = (JButton)e.getSource();
if (jsp.isVisible()) {
jsp.remove(rightBtn);
jsp.remove(leftBtn);
jsp.setVisible(false);
contentPane.removeAll();
contentPane.add(source);
} else {
contentPane.removeAll();
jsp.setLeftComponent(leftBtn);
jsp.setRightComponent(rightBtn);
jsp.setDividerLocation(0.5);
jsp.setVisible(true);
contentPane.add(jsp);
}
contentPane.revalidate();
contentPane.repaint();
source.requestFocusInWindow();
}
};
rightBtn.addActionListener(actionListener);
leftBtn.addActionListener(actionListener);
contentPane.add(jsp);
contentPane.setPreferredSize(new Dimension(800, 600));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
jsp.setDividerLocation(0.5);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
コンポーネント A および B への参照がある場合、コンポーネント A または B のJSplitPane.remove()メソッドまたはJComponent.setVisible(false)メソッドを使用できます。
テストコード:
final JFrame f = new JFrame();
final JSplitPane jsp = new JSplitPane();
final JButton leftB = new JButton("Left: Hide Self");
final JButton rightB = new JButton("Right: Show Left");
jsp.setOneTouchExpandable(true);
leftB.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
jsp.remove(leftB);
}
});
rightB.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
jsp.setLeftComponent(leftB);
}
});
jsp.setLeftComponent(leftB);
jsp.setRightComponent(rightB);
f.add(jsp);
f.setSize(800, 600);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
HORIZONTAL_SPLIT が 2 つのコンポーネント (左が A、右が B) で分割されていると仮定します。
A を非表示にして、B がすべての分割ペインのスペースを占めるようにする方法を次に示します。
myButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mySplitPane.setDividerSize(0);
mySplitPane.setDividerLocation(mySplitPane.getLocation().x);
}
});
コンポーネント B を非表示にして A を表示するには -
...
mySplitPane.setDividerLocation(pane.getLocation().x+pane.getSize().width);
...
垂直分割がある場合は、同様のアプローチを使用して、 とx
でy
切り替えwidth
ますheight
完全な解決策として、サイズ変更イベントをリッスンし (該当する場合)、仕切りの位置を再計算する必要があります (つまり、現在どこかに表示されている状態を保存する必要があります)。
これを使用して、フレームの下部にあるログ パネルを切り替えます。
private void toggleLogPanel()
{
if(m_logPanel.isShowing())
{
m_logDimension = m_logPanel.getSize();
m_splitpane.setBottomComponent(null);
m_splitpane.setDividerSize(0);
}
else
{
m_logPanel.setPreferredSize(m_logDimension);
m_splitpane.setBottomComponent(m_logPanel);
m_splitpane.setDividerSize(new JSplitpane().getDividerSize());
}
m_splitpane.resetToPreferredSizes();
}
これにより、コンポーネントのサイズが記憶され、復元されます。