Swing JSplitPane - 有没有办法听分频器的箭头?

时间:2015-07-29 18:45:50

标签: java swing

当小小的"最小化"我试图抓住这个事件。或者"最大化"点击JSplitPane分频器的箭头。

我找到了一种方法来听取分隔栏上的点击其他地方。类似的东西:

SplitPaneUI spui = splitPane.getUI();
if (spui instanceof BasicSplitPaneUI) {
    ((BasicSplitPaneUI) spui).getDivider().addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            // do something...
        }
    });
}

但有没有办法听取点击箭头

3 个答案:

答案 0 :(得分:3)

  

当点击JSplitPane分频器的小“最小化”或“最大化”箭头时,我正试图捕捉事件。

也许您可以向PropertyChangeListener添加JSPlitPane并监听dividerLocation更改(假设您不关心分隔符是否被拖动或“单击”到开头或结束)。然后,您可以检查分隔符位置是0还是最大值。

splitPane.addPropertyChangeListener("dividerLocation", this);

...

public void propertyChange(PropertyChangeEvent e)
{
    //  Get the new divider location of the split pane

    int location = ((Integer)e.getNewValue()).intValue();

    if (location == 0)
        //  do something
    else if (location == splitPane.getMaximumDividerLocation())
        //  do something else
}

如果您确实关心拖动和点击之间的区别,那么您可以比较旧/新值并查找位置变化大于指定值。

另一种选择是从分隔符获取按钮:

JSplitPane splitPane = (JSplitPane)e.getSource();
BasicSplitPaneUI ui = (BasicSplitPaneUI)splitPane.getUI();
BasicSplitPaneDivider divider = ui.getDivider();
JButton button1 = (JButton)divider.getComponent(0)

现在,您可以向按钮添加另一个ActionListener以执行自定义代码。

答案 1 :(得分:2)

反射是我想听听One Touch可扩展按钮的唯一方法

只需通过addSplitPaneListener即可完成。

public void addSplitPaneListener(JSplitPane splitPane) {
    addSplitPaneListener("leftButton", splitPane);
    addSplitPaneListener("rightButton", splitPane);
}

public void addSplitPaneListener(String button, JSplitPane splitPane) {
    try {
        Field field = BasicSplitPaneDivider.class.getDeclaredField(button);
        field.setAccessible(true);
        JButton onetouchButton = (JButton) field.get(((BasicSplitPaneUI) splitPane.getUI()).getDivider());
        onetouchButton.setActionCommand(button);
        onetouchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                buttonClicked(e);
            }
        });
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
        //Logger.getLogger(NewJFrame1.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void buttonClicked(ActionEvent e) {
    System.out.println("Clicked " + e.getActionCommand());
}

答案 2 :(得分:0)

这是一个派生类,它使用单触发扩展器和/或绑定到某个键的附加键控器来处理扩展/隐藏,以隐藏/取消隐藏右侧面板。左边做它应该很容易适应;)

有趣的是,在Linux上,正确的部分永远不会获得理论上的最大值,但会少一个(BUGCLICKONETOUCH)。没有测试Windows上是否也是如此。

import java.awt.Component;

import javax.swing.JSplitPane;

public class JToggleSplitPane extends JSplitPane {

  private int restoreWidth = -1;
  private final static int BUGCLICKONETOUCH = 1; 

  public JToggleSplitPane(int splittype, Component c1, Component c2) {
    super(splittype, c1, c2);
    setOneTouchExpandable(true);
  }

  public void toggle() {
    try {
      if (getDividerLocation() < getWidth() - getDividerSize() - BUGCLICKONETOUCH) {
        restoreWidth = getWidth() - getDividerSize() - getDividerLocation();
        setDividerLocation(1.0d);
      } else {
        setDividerLocation(getWidth() - getDividerSize() - restoreWidth);
      }
      updateUI();
      doLayout();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void doLayout() {
    super.doLayout();
    if (restoreWidth == -1) {
      restoreWidth = rightComponent.getWidth();
    }
  }
}