# JSpinner, setValue



## mla.rue (14. Mai 2012)

Ich habe hier einen Fehler (logischen?) der nicht vom Compiler angezeigt wird, die Anwendung funktioniert auch bis auf einen Fall. Die Anwendung: ein Hauptfenster, das hat unter anderem einen Schalter, der ein modales Dialogfenster aufruft. Dieses wiederum hat unter anderem einen JSpinner, mit dem sich Kalenderwochen einstellen lassen.

1) wird die Anwendung (kalender.jar) mit einem Mausklick gestartet (Doppelklick in Windows, Einfach bzw DOppelklick Linux auf die .jar Datei), wird das Programm ausgeführt (Hauptfenster angezeigt), der entsprechende KW Auswahldialog allerdings nicht (kommentiere ich in der Dialog-Klasse die Zeile jspinnerKW.setValue(iWoche+". KW"); aus, funktioniert es

2) wird die Anwendung über eine Konsole gestartet (Aufruf: java -jar kalender.jar) funktioniert die Anwendung problemlos

3) wird die Anwendung über ein Script gestartet (das nur die Zeile java -jar kalender.jar beinhaltet), funktioniert die Anwendung problemlos

4) aus der IDE (Eclipse) funktioniert die Anwendung problemlos

da es sich doch um ziemlich viel Code handelt, hier nur der Auszug betreffend meinen JSpinner:


```
iAnzWochen = clsDZ.getNumberOfWeeks(iJahr);
iWoche = clsDZ.getCurrentWeek(iJahr);
for (int i = 0; i < iAnzWochen; i++) {
    listKW.add((i + 1) + ". KW");
}

SpinnerListModel slm = new SpinnerListModel(listKW);
jspinnerKW.setModel(slm);
jspinnerKW.setValue(iWoche + ". KW");
```

WIe gesagt funktioniert das Programm "die meiste Zeit",  es ist zwar kein Problem das Programm über eine Script Datei zu starten, hätte dann aber doch gerne einen funktionierenden Mausklick . Evtl gibt es mit setValue beim JSPinner irgendeinen Trick (oder Bug?) den ich noch nicht kenne, oder ich sehe den Wald vor lauten Bäumen nicht.

PS: kein Experte, vor 3 Monaten mit Java angefangen
edit: Schreibfehler im Code korrigiert (SpinnerListModel(listKW))


----------



## Camino (14. Mai 2012)

Wird denn auch keine Fehlermeldung ausgegeben? Ansonsten einfach mal ein paar Testausgaben auf der Konsole machen.
Ich bin mir auch nicht sicher, ob man sich beim JSpinner nicht erst noach das Model holen muss, also etwa so:

```
jspinnerKW.getModel().setValue(iWoche + ". KW");
```


----------



## Volvagia (14. Mai 2012)

Versuch mal sie per javaw über die Konsole zu starten.


----------



## mla.rue (14. Mai 2012)

@ Camino: eben keine Fehlermeldung, das mit .getModel war mein erster Gedanke, gleiches Ergebnis wie im Normalfall

@Volvagia: unter Linux gibt es standardmässig wohl kein javaw und gerade habe ich keinen Zugriff mehra uf eine Windows Kiste, mal schauen wenn ich Daheim bin


----------



## bERt0r (14. Mai 2012)

Dein Problem ist folgendes: Du gibst deinem Model eine Liste Strings. Wenn du jetzt setValue aufrufst, akzeptiert diese Funktion nur einen der Strings, die du in deinem Model hast. Du baust mit iWoche + ". KW" aber einen neuen String. Auch wenn der genauso aussehen mag wie einer der in deiner Liste ist, ist es doch ein anderes String Objekt.
Ich würde deinem Spinner einfach ein NumberModel geben und noch einen Editor schreiben, der dir das . KW hinten dranhängt.
Beispiel gibts z.B hier: Customizing the Editor in a JSpinner Component | Example Depot


----------



## mla.rue (15. Mai 2012)

Klingt ersteinmal logisch, ist aber trotzdem komisch. Bei einer Kombobox kann man auch mit jcombobox.setSelectedValue(Object) einen Wert zuweisen (auch wenn dieses Object ein anderes ist als das, was gerade in der Kombohox "abhängt"), ohne Probleme. Wieso soll sich da ein JSpinner anders verhalten? Hm.

Habe ersteinmal die einfachere Variante versucht, ich merke mir den Index der aktuellen Woche in meiner Liste und übergebe dann die, wie schon zuvor funktioniert alles einwandfrei, bis auf Variente 1 der Ausführung.


```
for (int i = 0; i < iAnzWochen; i++) {
     listKW.add((i + 1) + ". KW");
     if((i+1) == iWoche){
          n = i;    
     }
}
 
SpinnerListModel slm = new SpinnerListModel(listKW);
jspinnerKW.setModel(slm);
jspinnerKW.getModel().setValue(listKW.get(n));
//slm.setValue(listKW.get(n));
```

Ich werde es jetzt ersteinmal noch mit dem Editor versuchen, habe ich gestern schon angetestet, nur wurde mir da immer der Punkt zu einem Komma umgewandelt.


----------



## bERt0r (15. Mai 2012)

Mein Link war vielleicht nicht ganz optimal, weil da mit einem Panel gearbeitet wird. Am einfachsten gehts, wenn dein Editor von einem JLabel erbt. Der Name Editor ist auch ziemlich irreführend, bei Lists und Tables wird sowas Renderer genannt und ein Editor macht ganz was anderes.

```
public class Editor extends JLabel implements ChangeListener {

        Editor(JSpinner spinner) {
            // Add the listener
            spinner.addChangeListener(this);
        }

        // Handles changes to the value stored in the model
        public void stateChanged(ChangeEvent evt) {
            JSpinner spinner = (JSpinner)evt.getSource();

            // Get the new value
            Object value = spinner.getValue();
            this.setText(value+". KW");
        }
```


----------



## mla.rue (15. Mai 2012)

ist das nicht wie mit Kanonen auf Spatzen schießen? Da hat der JSPinner 1-52/53 und drüber wird der Editor mit formatiertem x. KW gestülpt ... mh, etwas extrem wie ich finde . Aber einen Test wert.


----------

