6

A と B の 2 つのコンポーネントを持つ JSplitPane がありますが、B を非表示にしたい場合があるため、次のいずれかが当てはまります。

  • コンポーネント A と B は JSplitPane に表示されます
  • コンポーネント A のみが JSplitPane が占有するスペースに表示されます

これを行う方法はありますか?

4

6 に答える 6

4

一体、私は解決策を試みます...

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);
   }
}
于 2011-07-26T21:15:34.897 に答える
1

コンポーネント 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);
于 2011-07-26T20:41:50.633 に答える
1

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);
...

垂直分割がある場合は、同様のアプローチを使用して、 とxy切り替えwidthますheight

完全な解決策として、サイズ変更イベントをリッスンし (該当する場合)、仕切りの位置を再計算する必要があります (つまり、現在どこかに表示されている状態を保存する必要があります)。

于 2011-07-26T21:13:36.300 に答える
0

これを使用して、フレームの下部にあるログ パネルを切り替えます。

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();
}

これにより、コンポーネントのサイズが記憶され、復元されます。

于 2015-04-24T18:00:46.023 に答える