【问题标题】:Which button of JSpinner has been pressed?JSpinner的哪个按钮被按下了?
【发布时间】:2011-03-04 04:32:25
【问题描述】:

是否有可能知道,从从 JSpinner 接收 ChangeEvent 的 ChangeListener 内部, 按下了哪个按钮(递增/递减)?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    简短回答:不,无法知道按下了哪个按钮

    长答案:根据您的模型和更改侦听器,如果您在新值和先前值之间进行比较,则可以知道用户是前进还是后退。

    【讨论】:

      【解决方案2】:

      您可以检查触发事件的对象。也许保存事件之前的值并确定它在事件期间是上升还是下降。

      【讨论】:

        【解决方案3】:

        将实际值与前一个值进行比较。方法如下:

        ChangeEvent ce = ...
        ((JSpinner)ce.getSource()).getPreviousValue();
        

        【讨论】:

        • 我认为这只会从当前值返回下一个值,而不是之前选择的值。
        【解决方案4】:

        您可以通过存储旧值来检查新值与旧值:

        int currentValue = spinner.getValue();
        spinner.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent e) {
                int value = spinner.getValue();
                if(value > currentValue) {
                    // up was pressed
                } else if(value < currentValue) {
                    // down was pressed
                }
                currentValue = value;
            }
        });
        

        【讨论】:

        • 是的,我明白这一点,但我想做的是使用 JSpinner,使当前值保持步长,并使用递增/递减按钮来修改另一个字段我的gui根据步骤。所以下一个和上一个值应该始终保持不变,除非我手动修改显示的步长值。我不知道我的解释是否足够清楚。无论如何感谢您的解决方案
        • @Overbose - 在这种情况下,也许你想让你的其他价值听SpinnerModel?这似乎是一个很好的解决方案。
        【解决方案5】:

        JSpinner 是一个复合组件,可以将 mouseListeners 添加到它包含的组件中。您必须进行一些试验才能弄清楚如何将按钮彼此以及与文本字段区分开来。一种快速而肮脏的方法是检查它们的坐标。

        我不确定你是要迭代 JSpinner 本身包含的组件,还是 JSpinner.getEditor() 返回的容器包含的组件,所以两者都试试。

        【讨论】:

          最近更新 更多