我创建了一个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 spinbox
和JSpinner _spiNumOfAis
,前者是GUI中可见的微调器。
答案 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