我使用JSpinner
调整图表上的值,该图表具有撤消功能。我不想为每个微调器按钮单击事件创建撤消,而是在用户完成单击JSpinner
按钮并将鼠标移离微调器控件时进行单击撤消。
如果用户将鼠标指针快速移开,则正常JSpinner
mouseExited
非常不稳定(如果在微调按钮和{{之间的边界上检测到鼠标指针,则移动它会缓慢移动) 1}}边界)。是否有可能检测到旋转按钮本身的mouseExited? ' FocusLost'在用户点击其他地方之前,如果是第一次撤消,则不会启用撤消按钮,并且如果他们不这样做,他们可能会认为他们的更改无法撤消。
任何可行的方法都将受到赞赏。提前谢谢。
答案 0 :(得分:3)
也许您可以使用MouseListener
并处理mouseEntered
和mouseExited
。
如果用户使用键盘增加/减少微调器值,撤消逻辑会发生什么?
也许更好的解决方案是听取值更改,然后在1或2秒内启动Timer
。当计时器触发时,你会处理。每次更改值时,都会重置Timer。这些将用于对您定义的间隔内所做的所有更改进行分组。无论是使用鼠标还是键盘,此解决方案都可以使用。
答案 1 :(得分:0)
我正在测试MouseInputListener
和MouseAdapter
。
JSpinner.DefaultEditor jspdeSpinner = (JSpinner.DefaultEditor)theSpinner.getEditor();
MouseListener ml_milForSpin = new MouseInputListener() {
@Override
public void mouseMoved(MouseEvent e) { }
@Override
public void mouseDragged(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) { }
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) {
System.out.println(" - > mouseEntered(x:" + e.getX() + " , y:"+ e.getY() + ")");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println(" - > mouseExited(x:" + e.getX() + " , y:"+ e.getY() + ")");
}
};
MouseListener ml_maForSpin = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) { }
@Override
public void mouseDragged(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) { }
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) {
System.out.println(" - > mouseEntered(x:" + e.getX() + " , y:"+ e.getY() + ")");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println(" - > mouseExited(x:" + e.getX() + " , y:"+ e.getY() + ")");
}
};
测试已分配监听器
jspdeSpinner.addMouseListener(ml_maForSpin); // Doesn't Work!!!
jspdeSpinner.addMouseListener(ml_milForSpin); // Doesn't Work!!!
//检查此
JTextField jtfSpinner = jspdeSpinner.getTextField();
jtfSpinner.addMouseListener(ml_maFragment); //Work!
jtfSpinner.addMouseListener(ml_milFragment); //Work!
如果您需要更改某些SpinnerModel
,请不要创建新内容,而是更改其参数! (如果你这样做,你需要再次重新分配MouseListener,因为当你分配一个新的SpinnerModel时它会丢失。)
一个例子(我正在谈论......):
((SpinnerNumberModel)theSpinner.getModel()).setValue(size/3);
((SpinnerNumberModel)theSpinner.getModel()).setMinimum(0);
((SpinnerNumberModel)theSpinner.getModel()).setMaximum(isize/2);
((SpinnerNumberModel)theSpinner.getModel()).setStepSize(1);