2017-12-25 13 views
-3

私は、既にJSpinnerのカスタネットモデルを作成しようとしていますが、うまくいきません。 コードのようになります。私が望んでいたすべて、冒頭でSpinnerModelの機能の例Java Swing

public class Test 
{ 
public static void main(String[] args) 
{ 
    ModelJSpinner model = new ModelJSpinner(10L, 20L, 5L); 
    JSpinner spinner = new JSpinner(model); 
    spinner.setModel(model); 
    spinner.setValue(15L); 
    JFrame frame = new JFrame("adasasd"); 
    frame.setSize(350, 150); 
    frame.add(spinner); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setVisible(true); 

} 

} 

...私は次のコードを実行したときしかし、私は...多くを行うdoesntのJSpinnerのを除き、あまり何も得る

public class ModelJSpinner implements SpinnerModel 
{ 
private long value; 

private long min; 

private long max; 

private long increment; 

private ChangeListener l; 

private ArrayList<ChangeListener> listeners; 

@Override 
public Object getValue() 
{ 

    return null; 
} 

public ModelJSpinner(long min, long max, long increment) 
{ 
    super(); 
    this.min = min; 
    this.max = max; 
    this.increment = increment; 
    setValue(min); 
    listeners = new ArrayList<>(); 
} 

@Override 
public void setValue(Object value) 
{ 
    if (value == null) 
    { 

    }else { 
     this.value = (Long) value;  
    } 


    //fireStateChanged(); 

} 

private void fireStateChanged() 
{ 
    if (listeners == null) 
     return; 
    for (int a = 0; a < listeners.size(); a++) 
    { 
     ChangeListener l = (ChangeListener) listeners.get(a); 
     try 
     { 
      l.stateChanged(new ChangeEvent(this)); 
     } 
     catch (RuntimeException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

@Override 
public Object getNextValue() 
{ 
    Long nextValue = value + increment; 
    if (nextValue > max) 
    { 

     return null; 
    } 
    else 
    { 

     return nextValue; 
    } 
} 

@Override 
public Object getPreviousValue() 
{ 
    Long previousValue = value - increment; 
    if (previousValue < min) 
    { 

     return null; 
    } 
    else 
    { 

     return previousValue; 
    } 
} 

@Override 
public void addChangeListener(javax.swing.event.ChangeListener l) 
{ 
    this.l = l; 
    listeners.add(l); 

} 

@Override 
public void removeChangeListener(javax.swing.event.ChangeListener l) 
{ 
    if (this.l == l) 
    { 
     l = null; 
    } 
    listeners.add(l); 

} 

} 

JSpinnerが上記のモデルで何かをやることができ、後に私はチェンジリストを実装したいと考えていました。

今のところ、私はそれを正しく描くことさえできません。誰かが私を助けてくれるチャンスはありますか?

JSpinnerのモデルとしてSpinnerModelを実装しているクラスのインスタンスを使用する必要がありますが、動作させることはできません。

BR DK

答えて

2

は、これは失敗する保証です:

@Override 
public Object getValue() 
{ 
    return null; 
} 

これはJSpinnerのは、表示する値を決定するために使用する方法であるから。

代わりに、valueフィールドの値を返してください。また、getNextValue()にはnullを返さないでください。次の値がmaxより大きい場合代わりに最大値を返します。 getPreviousValue()の場合も同様に、計算された前の値がminより小さい場合はmin値を返します。

1が利用可能である(デフォルトのモデルクラス、またはより良い、しかしどれもスピナーモデルのために利用できない)場合は、抽象モデルクラスを拡張使用することは通常優れていること例えば、

public class SpinnerModel3 implements SpinnerModel { 
    private long value; 
    private long min; 
    private long max; 
    private long increment; 
    // using a set to avoid allowing addition of duplicate listeners 
    private Set<ChangeListener> listenerSet = new HashSet<>(); 

    public SpinnerModel3(long value, long min, long max, long increment) { 
     super(); 
     this.value = value; 
     this.min = min; 
     this.max = max; 
     this.increment = increment; 
    } 

    @Override 
    public void addChangeListener(ChangeListener l) { 
     listenerSet.add(l); 
    } 

    @Override 
    public Object getNextValue() { 
     long nextValue = value + increment; 
     nextValue = Math.min(nextValue, max); 
     return nextValue; 
    } 

    @Override 
    public Object getPreviousValue() { 
     long prevValue = value - increment; 
     prevValue = Math.max(prevValue, min); 
     return prevValue; 
    } 

    @Override 
    public Object getValue() { 
     return value; 
    } 

    @Override 
    public void removeChangeListener(ChangeListener l) { 
     listenerSet.remove(l); 
    } 

    @Override 
    public void setValue(Object value) { 
     this.value = (long) value; 
     fireStateChanged(); 
    } 

    protected void fireStateChanged() { 
     // create a ChangeEvent object 
     ChangeEvent e = new ChangeEvent(this); 
     for (ChangeListener l : listenerSet) { 
      l.stateChanged(e); // notify all listeners 
     } 
    } 
} 

は注意。だからもっと良い:

@SuppressWarnings("serial") 
public class SpinnerModel2 extends AbstractSpinnerModel { 
    private long value; 
    private long min; 
    private long max; 
    private long increment; 

    public SpinnerModel2(long value, long min, long max, long increment) { 
     super(); 
     this.value = value; 
     this.min = min; 
     this.max = max; 
     this.increment = increment; 
    } 

    @Override 
    public Object getNextValue() { 
     long nextValue = value + increment; 
     nextValue = Math.min(nextValue, max); 
     return nextValue; 
    } 

    @Override 
    public Object getPreviousValue() { 
     long prevValue = value - increment; 
     prevValue = Math.max(prevValue, min); 
     return prevValue; 
    } 

    @Override 
    public Object getValue() { 
     return value; 
    } 

    @Override 
    public void setValue(Object value) { 
     this.value = (long) value; 
     fireStateChanged(); 
    } 

}