当小小的"最小化"我试图抓住这个事件。或者"最大化"点击JSplitPane分频器的箭头。
我找到了一种方法来听取分隔栏上的点击其他地方。类似的东西:
SplitPaneUI spui = splitPane.getUI();
if (spui instanceof BasicSplitPaneUI) {
((BasicSplitPaneUI) spui).getDivider().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// do something...
}
});
}
但有没有办法听取点击箭头?
答案 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();
}
}
}