3

这可能是一个愚蠢的问题,但我必须问!

我有以下代码片段,它们应该在用户与对象交互时运行其相应的方法。出于某种原因,“foo”永远不会被打印,但“bar”却是。

myJSpinner1.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseEntered(java.awt.event.MouseEvent evt) {
    System.out.println("foo"); //"foo" is not printed
  }
});

myJSpinner2.addChangeListener(new java.awt.event.ChangeListener() {
    public void stateChanged(java.awt.event.ChangeEvent evt) {
    System.out.println("bar"); //"bar" is printed
  }
});

我没有异常或堆栈跟踪。我在 MouseListener 中缺少什么?提前致谢。

编辑: MouseEntered 在以完全相同的方式实现的 JCheckBox 上完美运行!

4

4 回答 4

4

JSpinner是一个复合组件,由一个文本字段和 2 个按钮组成。可以通过迭代结果getComponents()并为每个监听器添加鼠标监听器来为所有这些监听器添加鼠标监听器。

然而,根据我的经验,当某件事需要做这么多工作时,你可能会走错路。

为什么你需要鼠标输入的信息JSpinner
你想用这个活动做什么?

更新: 如果您希望提供有关面板中所有控件的信息,您可能需要查看使用玻璃窗格来检测鼠标下的组件。

Alexander Potochkin的《行为良好的 Glasspane》是一个很好的起点。

于 2010-03-31T13:44:24.420 回答
2

这是一个猜测,但我怀疑您需要将 a 添加MouseListenerJSpinner的编辑器(通过调用getEditor())。我想编辑器Component占据了 s 中的所有可用空间,JSpinner因此拦截了所有MouseEvents。

于 2010-03-31T11:50:51.773 回答
2

这对我有用。

JSpinner spinner = new JSpinner();

((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addMouseListener(
    new java.awt.event.MouseAdapter() {            
    public void mouseClicked(final MouseEvent e) {   
        // add code here
    }
});

由于我们的软件要求,我需要这个来唤起一个弹出键对话框以增加可用性。

于 2011-10-07T19:56:47.007 回答
0

除了@Rapier 答案...

如果您使用类似的东西更改 Spinner

yourOldSpinner = new JSpinner(new SpinnerModel(...))

您将失去以前的 MouseListener ...

如果您需要更改某些内容SpinnerModel,请不要创建新的,而是更改其参数!(如果这样做,则需要再次重新分配 MouseListener,因为分配新的 SpinnerModel 时它会丢失)。

一个例子(我在说......):

((SpinnerNumberModel)yourOldSpinner.getModel()).setValue(size/3);
((SpinnerNumberModel)yourOldSpinner.getModel()).setMinimum(0);
((SpinnerNumberModel)yourOldSpinner.getModel()).setMaximum(isize/2);
((SpinnerNumberModel)yourOldSpinner.getModel()).setStepSize(1);
于 2016-06-30T08:00:17.487 回答