java - JSpinner stateChanged 是如何工作的?

标签 java swing jspinner changelistener

为什么代码在JSpinner的change事件中进入了两次?

private javax.swing.JSpinner spinner = new javax.swing.JSpinner()
spinner.setModel(new javax.swing.SpinnerDateModel());
    spinner.addChangeListener(new javax.swing.event.ChangeListener() {
        @Override
        public void stateChanged(javax.swing.event.ChangeEvent evt) {
            System.out.println("Just a test");
        }
    });

当你只点击一次时,上面的代码会显示两次消息。

最佳答案

生成了 2 个事件:一个用于取消选择值,另一个用于在组件中选择新值。正如@camickr 在他的评论中指出的那样,这种行为发生在 SpinnerDateModel 中,但不是在默认的 SpinnerNumberModel

作为解决方法,您可以使用

spinner.addChangeListener(new ChangeListener() {

    Object lastValue;

    @Override
    public void stateChanged(ChangeEvent evt) {

        if (lastValue != null && !spinner.getValue().equals(lastValue)) {
           // expensive code calls here!
        }
        lastValue = spinner.getValue();
    }
});

这不会阻止监听器被调用两次,但防止不必要地调用任何昂贵的代码

关于java - JSpinner stateChanged 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19165970/

相关文章:

java - 对象在方法中为 null,但在类中不为 null

java - XSD 是否允许同时使用 simpleContent 和 complexContent?

java - 关于Java中对齐的问题

java - DefaultTableCellRenderer 不工作

java jspinner 更改监听器触发器

java - 让 ENTER 像使用 JTextField 一样使用 JSpinner

java - ExecutorService 与 Runnable 共享 CyclicBarrier

java - 将Keylistener添加到全屏JWindow

java - 重置 Java Swing 中的微调器值

主窗口中的 Java 颜色选择器面板?