2017-12-25 3 views
-3

Ich versuche schon, custome Modell für Jspinner zu machen, aber es funktioniert nicht. der Code wie folgt aussieht:SpinnerModel Funktionsweise Beispiel Java Swing

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); 

} 

} 

jedoch, wenn ich den folgenden Code ausführen bekomme ich ... nicht viel außer JSpinner, die viel tun tun ...

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); 

} 

} 

Am Anfang alles, was ich wollte war nur zu sehen, dass Jspinner etwas mit dem oben genannten Model machen kann und später wollte ich ChangeListener implementieren.

Ab jetzt kann ich es nicht einmal richtig gezeichnet haben. Gibt es eine Chance, dass mir jemand helfen könnte?

Ich brauche Instanz der Klasse implementieren SpinnerModel als Modell für JSpinner und ich kann es einfach nicht funktionieren.

BR DK

Antwort

2

Dies ist eine Garantie zum Scheitern verurteilt:

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

da dies die Methode ist, dass die JSpinner verwendet, um zu bestimmen, welcher Wert anzuzeigen.

Geben Sie stattdessen den Wert zurück, der von Ihrem Feld value gehalten wird. Geben Sie auch nicht null für die getNextValue() zurück, wenn der nächste Wert über max liegt. Stattdessen geben Sie die max. Geben Sie für den Wert getPreviousValue() den Wert min zurück, wenn der vorher berechnete Wert kleiner als min ist.

Zum Beispiel

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 
     } 
    } 
} 

Beachten Sie, dass es in der Regel besser ist die Verlängerung der abstrakte Modellklasse zu verwenden, wenn ein solcher vorhanden ist (oder noch besser, ist die Standard-Modellklasse, aber kein für Spinner Modell verfügbar) . Also noch besser:

@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(); 
    } 

}