3

我用这样的 as 模型制作了一个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是成员变量。

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

4

1 回答 1

4

所有 Swing 操作都应该在 EDT 上执行,因此与 UI 的交互总是发生在 EDT 上。简而言之,您ChangeListener将在 EDT 上被调用,因此无需同步。您可以通过EventQueue.isDispatchThread在侦听器中使用来轻松验证这一点,这将返回true. 这在Swing 并发课程中进行了解释,我从中引用:

事件调度线程,所有事件处理代码都在其中执行。大多数与 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 );
      }
    } );
  }
}

随意修改它以说明您的问题。我还可以建议查看JSpinner类 javadoc,因为编辑器和模型值可能会不同步,如 javadoc 中所述。另一个很好的起点是关于微调器的 Swing 教程

于 2012-04-28T09:21:07.633 回答