带有SpinnerNumberModel的JSpinner始终返回值0

时间:2012-04-28 09:01:01

标签: java swing jspinner changelistener

我创建了一个JSpinner组件,其中SpinnerNumberModel为模型,如下所示:

JSpinner spinbox = new JSpinner(new SpinnerNumberModel(2, 1, 7, 1));

我添加了一个侦听器来检测更改。

spinbox.addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent arg0) {
        synchronized (this) {
            System.out.println("New value: " +
              ((Integer)_spiNumOfAIs.getValue()).intValue());
        }
    }
});

然而,我所看到的只是:

  

新值:0

     

新值:0

我是否错误地读出了旋转箱的值?

如果你想知道synchronized块:我是Swing的新手,我不知道动作监听器是否在我创建JDialog的同一个线程上执行所以我为所有动作听众设置了线程安全措施,以确保安全。 _spiNumOfAIs是成员变量。

编辑:即使是从这个小代码片段中我也很明显看不到它......重构时我忘记了我同时使用JSpinner spinboxJSpinner _spiNumOfAis,前者是GUI中可见的微调器。

1 个答案:

答案 0 :(得分:4)

所有Swing操作都应该在EDT上执行,因此与您的UI交互总是在EDT上进行。简而言之,您的ChangeListener将在EDT上调用,因此无需进行同步。您可以在侦听器中使用EventQueue.isDispatchThread轻松验证这一点,该true将返回import javax.swing.JFrame; import javax.swing.JSpinner; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.EventQueue; public class JSpinnerDemo { public static JFrame createFrame(){ JFrame frame = new JFrame( ); frame.add( createSpinner() ); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.pack(); return frame; } public static JSpinner createSpinner(){ JSpinner spinner = new JSpinner( new SpinnerNumberModel( 2,1,7,1 ) ); spinner.addChangeListener( new ChangeListener() { @Override public void stateChanged( ChangeEvent e ) { JSpinner spinner = ( JSpinner ) e.getSource(); SpinnerModel spinnerModel = spinner.getModel(); System.out.println(spinnerModel.getValue()); } } ); return spinner; } public static void main( String[] args ) { EventQueue.invokeLater( new Runnable() { @Override public void run() { createFrame().setVisible( true ); } } ); } } 。我在Swing concurrency lesson中对此进行了解释,我引用了它:

  

事件调度线程,执行所有事件处理代码。大多数与Swing框架交互的代码也必须在此线程上执行。

要使用不正确的值进一步回答您的问题,您应该发布更多代码,以便我们重现您的问题。例如,这是一个微调器的基本工作示例

{{1}}

随意修改此内容以说明您的问题。我还可以建议查看JSpinner class javadoc,因为编辑器和模型值可能不同步,如javadoc中所述。另一个好的起点是Swing tutorial about spinners