是否可以检测jSpinner按钮上丢失的焦点

时间:2014-08-03 01:17:10

标签: java swing jspinner

我使用JSpinner调整图表上的值,该图表具有撤消功能。我不想为每个微调器按钮单击事件创建撤消,而是在用户完成单击JSpinner按钮并将鼠标移离微调器控件时进行单击撤消。

如果用户将鼠标指针快速移开,则正常JSpinner mouseExited非常不稳定(如果在微调按钮和{{之间的边界上检测到鼠标指针,则移动它会缓慢移动) 1}}边界)。是否有可能检测到旋转按钮本身的mouseExited? ' FocusLost'在用户点击其他地方之前,如果是第一次撤消,则不会启用撤消按钮,并且如果他们不这样做,他们可能会认为他们的更改无法撤消。

任何可行的方法都将受到赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:3)

也许您可以使用MouseListener并处理mouseEnteredmouseExited

如果用户使用键盘增加/减少微调器值,撤消逻辑会发生什么?

也许更好的解决方案是听取值更改,然后在1或2秒内启动Timer。当计时器触发时,你会处理。每次更改值时,都会重置Timer。这些将用于对您定义的间隔内所做的所有更改进行分组。无论是使用鼠标还是键盘,此解决方案都可以使用。

答案 1 :(得分:0)

我正在测试MouseInputListenerMouseAdapter

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