2017-05-26 85 views
1

我的問題很簡單,不幸的是我找不到答案。 基本上,我有一個Swing窗口,有2個JSpinner s。第二個JSpinner必須定義第一個JSpinner的上限。例如,如果用戶在第二個JSpinner上放置值4,則它們不能在第一個JSpinner中放置高於4的值。如果當前顯示在第一JSpinner值高於4我將它設置爲4獲取微調器的當前範圍?

所以我已經建立了我的兩個JSpinner s的SpinnerNumberModel在構造函數中設置初始範圍:

// First spinner 
SpinnerNumberModel spinnerLimits_sante = new SpinnerNumberModel(3, 0.25, 3, 0.25); 
JSpinner spin_sante = new JSpinner(spinnerLimits_sante); 

// Second spinner 
JSpinner spin_sante_max = new JSpinner(spinnerLimits_sante_max); 
SpinnerNumberModel spinnerLimits_sante_max = new SpinnerNumberModel(3, 3, 32767, 1); 

爲了得到第二個JSpinner當它改變時的價值,我想過使用它上面的ChangeListener。所以每當它發生變化時,我都可以獲得新值,使用新邊界重新創建一個對象(低邊界和間隔不會改變,但是高邊界將被更新,並且如果它的值將被更新高於上限)。

ChangeListener listenerSanteMax = new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     int newBound = spin_sante_max.getValue(); 
     // ... 
    } 
}; 
spin_sante_max.addChangeListener(listenerSanteMax); 

遺憾的是這就是我堅持:JSpinner沒有消氣,將返回一個SpinnerNumberModel對象,也沒有自己的價值觀。 即使有一個,似乎也沒有setter。

所以,我的問題: 是否有可能動態更改微調器的範圍和值?

在此先感謝!

+0

從Spinner獲取模型(測試它是否是'instanceof' SpinnerNumberModel')並使用它。 *「所以,我的問題:是否有可能動態地改變微調器的範圍和價值?「* - 我還沒有嘗試過,但是一旦擁有了'SpinnerNumberModel',就可以改變它的屬性 – MadProgrammer

+0

您是否熟悉類型轉換? –

回答

1

ChangeListener,而不是創建一個新的SpinnerNumberModel,只是更新的最大值現有模型。有兩種方法可以做到這一點。

如果ChangeListener可以看到微調模型,你可以直接進行更新。

ChangeListener listenerSanteMax = new ChangeListener() { 
    @Override 
    public void stateChanged(ChangeEvent e) { 
     Number newMaximum = spinnerLimits_sante_max.getNumber().doubleValue(); 
     spinnerLimits_sante.setMaximum((Comparable) newMaximum); 
    } 
}; 

如果ChangeListener無法看到微調模型,你可以做一個castJSpinner有一個getModel()方法返回a SpinnerModel。您可以將它投射到SpinnerNumberModel,但您應該使用instanceof來檢查演員陣容是否有效。

ChangeListener listenerSanteMax = new ChangeListener() { 
    @Override 
    public void stateChanged(ChangeEvent e) { 
     Object source = e.getSource(); 
     if (source instanceof JSpinner) { 
      JSpinner spinner = (JSpinner) source; 
      SpinnerModel sm = spinner.getModel(); 
      if (sm instanceof SpinnerNumberModel) { 
       SpinnerNumberModel model = (SpinnerNumberModel) sm; 
       Number newMaximum = model.getNumber().doubleValue(); 
       spinnerLimits_sante.setMaximum((Comparable) newMaximum); 
      } 
     } 
    } 
}; 

在任一情況下,newMaximumNumber,並且通過SpinnerNumberModel支持的所有子類是Comparable

+0

我甚至沒有意識到您可以在使用'SpinnerNumberModel'之後「放」到微調器中,我的聽衆可以看到微調器,所以我已經使用了第一種解決方案,並且添加了一個小的驗證來更新第一個微調器的值(通過它的'SpinnerNumberModel'),如果它高於值第二個微調,非常感謝! –

-1

使用getMode()獲得來自JSpinner和模型其類型強制轉換爲SpinnerModelNumber這樣的:

SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel(); 
相關問題