Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有SpinnerNumberModel的JSpinner始终返回值0_Java_Swing_Jspinner_Changelistener - Fatal编程技术网

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输入非数字