2017-05-26 5 views
1

私の質問は非常に簡単ですが、残念ながら私は答えを見つけることができません。 基本的に、私は2 JSpinnerでスイングウィンドウを持っています。 2番目のJSpinnerは、最初のJSpinnerの上限を定義する必要があります。たとえば、ユーザーが2番目のJSpinnerに値4を設定した場合、最初のJSpinnerには4を超える値を設定できません。スピナーの現在の範囲を取得しますか?

// 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に表示される値が4以上である場合、私は、だから私は、最初の境界を設定するために、コンストラクタで SpinnerNumberModelと私の2つの JSpinner Sを構築しました。4.

に設定します

それが変わるときに、第2 JSpinnerの値を取得するには、私はそれにChangeListenerを使用して考えました。したがって、変更するたびに新しい値を取得し、新しい境界を使用してSpinnerNumberModelオブジェクトを再作成することができます(下限および間隔は変更されませんが上限が更新され、値が更新されると値が更新されます)。高値より高い)。

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

私がこだわっているところ残念ながら、これは次のとおりです。JSpinnerSpinnerNumberModelオブジェクトもその値を返します何のゲッターを持っていません。 それがあったとしても、セッターがないようです。

私の質問 スピナーの範囲と値を動的に変更することはできますか?

ありがとうございます!

+0

とそれを使用する(それが '' SpinnerNumberModel' instanceof'だ場合、テスト) 'Spinner'からモデルを取得します。 * "だから、私の質問:ダイナミックレンジとスピンナの値を変更することは可能ですか?"* - 試したことはありませんが、一度SpinnerNumberModelを設定すると、そのプロパティを変更することができます – MadProgrammer

+0

タイプキャストと呼ばれることに慣れていますか? –

答えて

1

、代わりに新しいSpinnerNumberModelを作成するのではなく、単に更新の最大値を既存のモデル。それを行うには2つの方法があります。

ChangeListenerの場合は、アップデートを直接行うことができます。 ChangeListenerは、スピナーのモデルを見ることができない場合は

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

は、あなたがcastを行うことができます。 JSpinnerは戻りSpinnerModelgetModel()方法を有しています。 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を通して)値を更新するための小さな検証を追加しました。 2回目のスピナーの写真です。ありがとうございました! –

-1

使用getMode()JSpinnerとタイプキャストそれから、このようなSpinnerModelNumberにモデルを得るために:ChangeListener

SpinnerNumberModel snm = (SpinnerNumberModel)spinner.getModel(); 
関連する問題