Java 带有SpinnerNumberModel的JSpinner始终返回值0
我制作了一个带有Java 带有SpinnerNumberModel的JSpinner始终返回值0,java,swing,jspinner,changelistener,Java,Swing,Jspinner,Changelistener,我制作了一个带有SpinnerNumberModel的JSpinner组件,模型如下: JSpinner spinbox = new JSpinner(new SpinnerNumberModel(2, 1, 7, 1)); 我添加了一个侦听器来检测更改 spinbox.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent arg0) { s
SpinnerNumberModel
的JSpinner
组件,模型如下:
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
我读取spinbox的值是否有误
如果您想知道synchronized
块:我是Swing新手,不知道动作侦听器是否在创建JDialog
的同一线程上执行,因此我为所有动作侦听器设置了线程安全措施以确保安全\u spiNumOfAIs
是一个成员变量
编辑:即使从这个小代码片段中,我也看不到它。。。重构时,我忘记了我同时使用了
JSpinner微调器
和JSpinner\u spiNumOfAis
,前者是GUI中可见的微调器。所有Swing操作都应该在EDT上执行,因此与UI的交互总是在EDT上进行。简而言之,将在EDT上调用您的ChangeListener
,因此无需同步。您可以通过在侦听器中使用EventQueue.isDispatchThread
轻松验证这一点,它将返回true
。这一点在中有解释,我引述如下:
事件分派线程,其中执行所有事件处理代码。与Swing框架交互的大多数代码也必须在此线程上执行
为了进一步用不正确的值回答您的问题,您应该发布更多代码,以便我们重现您的问题。例如,这是微调器的一个非常基本的工作示例
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 );
}
} );
}
}
请随意修改以说明您的问题。我还建议您查看一下,因为编辑器和模型值可能会不同步,正如javadoc中所解释的那样。另一个好的起点是D'oh,糟糕的代码重构导致我访问一个不同的引用,而不是正在更新的spinbox。。。当我通过
e.getSource()
访问微调器时发现了这一点,就像在您的示例中一样。我的代码不好,我应该感到不好。不过,感谢您解释Swing的线程规则!SpinnerNumberModel所需文档,以防止向JSpinner输入非数字