2012-04-28 28 views
3

我由JSpinner組分與SpinnerNumberModel爲模型是這樣的:的JSpinner用的SpinnerNumberModel總是返回值0

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

難道我讀出紡紗器的值不正確?

如果您對​​區塊感到疑惑:我是Swing的新手,我不知道是否在創建我的JDialog的同一線程上執行動作偵聽器,因此我將線程安全所有行爲聽衆的安全措施。 _spiNumOfAIs是一個成員變量。

編輯:甚至從這個一小段代碼是太明顯了,我甚至沒有看到它... ...而重構我忘了,我同時使用JSpinner spinboxJSpinner _spiNumOfAis,前者是微調這在GUI中是可見的。

回答

4

所有Swing操作都應該在EDT上執行,並且作爲結果與您的UI交互總是在EDT上發生。總之,你的ChangeListener將在EDT上被調用,所以不需要同步。您可以通過在聽衆中使用EventQueue.isDispatchThread輕鬆驗證此內容,該聲明將返回true。這在Swing concurrency lesson中有解釋,我從中引用:

事件調度線程,其中執行所有事件處理代碼。與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 class javadoc,因爲編輯器和模型的值可能不同步,正如javadoc中所解釋的那樣。另一個很好的起點是Swing tutorial about spinners

+0

D'oh,糟糕的代碼重構導致我訪問不是更新的spinbox的不同引用......我通過'e.getSource()訪問微調器時發現了這個問題。 '就像你的例子。我的代碼很糟糕,我應該感覺不好。不過謝謝你解釋Swing的線程規則! – Pieter 2012-04-28 09:29:40

+0

需要SpinnerNumberModel文檔以防止非數字輸入到JSpinner – mKorbel 2012-04-28 10:08:11