# JSpinner



## Spin (7. Jan 2010)

Hallo ich sitze jetzt schon eine Weile und weiß nicht weiter.
Mit was für Listener kann ich den Wert holden , der sich beim hoch und runterdrücken ändert.

Weiterhin habe ich 8 JSpinner ,
kann ich alle mit einmal die Bedingung verpassen, dass sie nicht unter 0 gehen dürfen.

Ein weiteres Problem wäre ich müsste von jeden JSpinner den Wert holen und den brauch ich zum multiplizieren.

Muss ich dann jeden einzelnden ein Listener geben und das lokal in jeden Listener einer statischen int variable zuweisen , oder gibt es schönere wege ?

danke für tipps


----------



## Sonecc (7. Jan 2010)

Vl hilft dir das weiter Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.16 Auswahlmenüs, Listen und Spinner <- nicht getestet

Zu deiner zweiten Frage:

1 Listener erstellen, der die Daten abholt und dann sichert, diesen dann den Spinnern zuweisen


----------



## KrokoDiehl (7. Jan 2010)

Hallo.

Du kannst einen _ChangeListener _an deine Spinner hängen. Kann auch für alle Spinner der gleiche sein, denn im _ChangeEvent_-Objekt hängt dein jeweiliger Spinner als Quelle (
	
	
	
	





```
getSource()
```
).

Weiterhin kannst du über das _SpinnerModel _den Wert einschränken:

```
JSpinner mySpinner = new JSpinner(new SpinnerNumberModel(value, min, max, step));
```


----------



## SlaterB (7. Jan 2010)

darauf habe ich lange gewartet, dass Spin mal was über JSpinner schreibt


----------



## Spin (7. Jan 2010)

Hey Slater , eigentlich dachte ich , das JSpinner mein Freund wäre , aber irgendwie mhh

Ich habe noch nie mit den anderen Listener gearbeitet und irgendwie wollen die mich ärgern.


```
private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt) {
        Object a = evt.getSource();
        System.out.println(a);
    }
```

So geben ich die Objekte aus und bekomme komische Sachen 

Wie bekomm ich denn jetzt meine Daten ?


```
jSpinner1.getModel().getValue();
```

sowas gibts auch noch , aber wie verbinde ich die miteinander. Will doch nur den geänderten werd holen , grml.

Irgendwie was mit Textfeld.get ...fertig.

Habe gelesen das JSpnner dieses JFotmattetTextField anbietet , aber habe da auch schon einiges versucht :/

@sonecc

Das Daten einfügen und das Minimum setzen hat nun geklappt 

Braucht jetzt nur ne Methode zum holoen der werte, danke 



```
Object a = evt.getSource();
        if(a == jSpinner1){
            int a = (int)jSpinner1.getModel().getValue();
        }
```

mhh das casten will nicht


----------



## eRaaaa (7. Jan 2010)

Mal ein Tipp: bei google immer erstmal folgendes eingeben: how to guikomponente
Dann wärst du bei how to jspinner mit dem ersten Ergebnis bei How to Use Spinners (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) gelandet, was all deine Fragen beantwortet hätte 


```
JSpinner spinner = (JSpinner)e.getSource();
spinner.getValue(); //wert
```


----------



## Spin (7. Jan 2010)

Ja, danke.
@eraa , ich kenne diese ganzen Seiten, doch habe ich immer ein Objekt , wie in meinem Falle auch :


```
/**
     * Einkauflsite erstellen
     */
    public void partyOrganize() {

        Cocktail co;
        /* Aktuellen Cocktail aus der Combobox holen*/
        String c = (String) jC_party0.getSelectedItem();
        System.out.println(c);

        /* alle CocktailObjekte aus der Liste holen*/
        for (int i = 0; i < cl.sizeCocktails(); i++) {
               co = cl.getCocktail(i);

            /* Wenn der Objektname des Cocktail gleich dem namen des Strings
             * in der ComboBox ist*/
            if (co.getName().equals(c)) {
                for (int j = 0; j < co.getBestandteile().size(); j++) {
                    Bestandteil bestand = co.getBestandteil(i);
                    // von jedem Cocktailbestandteil die Menge * dem Wert im Spinner erhöhen
                    int count = bestand.getMenge() * (Integer) jSpinner1.getModel().getValue();
                    // Von dem Bestandteil neuen Bestand setzen
                    bestand.setMenge(count);
                    partyShoppingList(co);
                }
            } // if vorbei
        }
        
    }
        
    /* Wird ausgelöst, wenn man auf dem Button 'Einkaufsliste generieren' drückt.*/
    public void partyShoppingList(Cocktail co){
         /* Geänderte Daten in der Einkaufsliste anzeigen:*/
        /* Dazu Model verwenden:*/
        DefaultListModel model= new DefaultListModel();
        /* temporäres Cocktail*/
        Cocktail c = co;
        for (int i = 0; i < c.getBestandteile().size(); i++) {
                Bestandteil bestand = c.getBestandteil(i);
           /* Für den jeweiligen Cocktail , Menge usw. dem Model hinzufügen*/
            model.addElement(bestand.getMenge() + " " + bestand.getZutat().getEinheit() + " " +
                    bestand.getZutat().getName());
            
        }  
      }
```


```
int count = bestand.getMenge() * (Integer) jSpinner1.getModel().getValue();
```


Das haut nicht hin.

Zum anderen wollte ich mal fragen :
Ich habe 8 Comboboxen und 8 JSpinner. 

Bisher hole ich von einer JComboBox den String und vergleiche diesen mit einem Cocktail aus der Liste. Wenn dieser Cocktail true ist , dann soll den seinen Bestandteile * dem JSpinnerwert berechnet werden.

Im Nachhinein übergebe ich diesen Cocktail einer Methode , die dann diesen Cocktail ausgibt , mir erhöhter Menge.


Wie mache ich es wenn ich 8 * dieses Szenario habe?

Geht dass nur wenn ich meine Methoden kopiere und entsprechend die Variable änder?

Oder muss ich die Methoden mit parameter füllen , und immer mit anderen Werten füllen?
Wenn ich das zweite mache , bekomme ich denn nicht stress , ?

Szenario:

Jcombobox: Mai Tai    JSlider : 2

*klick * auf berechne : funktionen oben werden beide ausgelöst

Wenn ich nun :
Jcombobox: Mai Tai    JSlider : 2
Jcombobox: Mai Tai    JSlider : 2
Jcombobox: Mai Tai    JSlider : 2

3mal das mache und ich rufe auf, denn ruft er die gleiche Methgode mit verschiedenen Parametern auf.?
Danke für hilfe.

Vorallem im code


----------



## eRaaaa (7. Jan 2010)

Spin hat gesagt.:


> ```
> int count = bestand.getMenge() * (Integer) jSpinner1.getModel().getValue();
> ```
> 
> ...



Wieso nicht? Fehlermeldung? Könnte imo nur daran liegen, dass jSpinner1 der Methide nicht bekannt ist?!

Mhmm..bei dem Rest: Ich weiß nicht, klingt irgendwie nach Design-Fehler oder nicht so wirklich ergonomischer GUI.


----------



## Spin (7. Jan 2010)

Ich bekomme paar werte :
Hier ist ein Screenshot


Nun aufgehts:

```
public void partyOrganize() {
        Cocktail co;
        /* Aktuellen Cocktail aus der Combobox holen*/
        String c = (String) jC_party0.getSelectedItem();
        int count;
        /* alle CocktailObjekte aus der Liste holen*/
        for (int i = 0; i < cl.sizeCocktails(); i++) {
            co = cl.getCocktail(i);

            /* Wenn der Objektname des Cocktail gleich dem namen des Strings
             * in der ComboBox ist*/
            if (co.getName().equals(c)) {
                System.out.println(co.getName()+" "+1);
                for (int j = 0; j < co.getBestandteile().size(); j++) {
                    Bestandteil bestand = co.getBestandteil(i);
                    System.out.println(bestand.getMenge()+" "+2);
                    // von jedem Cocktailbestandteil die Menge * dem Wert im Spinner erhöhen
                    count = bestand.getMenge() * (Integer) jSpinner1.getModel().getValue();
                    // Von dem Bestandteil neuen Bestand setzen
                    System.out.println(count +" " +3);
                    bestand.setMenge(count);
                    
                }
                partyShoppingList(co);
                break;
            } // if vorbei
            
        }

    }

    /* Wird ausgelöst, wenn man auf dem Button 'Einkaufsliste generieren' drückt.*/
    public void partyShoppingList(Cocktail co) {
        /* Geänderte Daten in der Einkaufsliste anzeigen:*/
        /* Dazu Model verwenden:*/
        DefaultListModel model = new DefaultListModel();
        /* temporäres Cocktail*/
        Cocktail c = co;
        System.out.println(c.getName()+" "+4);
        for (int i = 0; i < c.getBestandteile().size(); i++) {
            Bestandteil bestand = c.getBestandteil(i);
            /* Für den jeweiligen Cocktail , Menge usw. dem Model hinzufügen*/
            model.addElement(bestand.getMenge() + " " + bestand.getZutat().getEinheit() + " " +
                    bestand.getZutat().getName());
            System.out.println(bestand.getMenge());

        }
        jL_partyShopping.setModel(model);
    }
```


Das ist mein Code, ich habe zusätzlich immer alles ausgeben lassen und Zahlen hinzugefügt:


```
Cuba Libre 1
200 2
400 3
400 2
800 3
800 2
1600 3
Cuba Libre 4
1600
0
50
```

Ich bekomme es nicht hin , selbst bei einen Cocktail und nur einem jSpinner.
Vorallem wenn ich das zweite mal auf dem knopf drücke haut er mir alles durcheinander :/



```
for (int i = 0; i < c.getBestandteile().size(); i++) {
            Bestandteil bestand = c.getBestandteil(i);
            for(int j =0;j<array.length;j++){
            /* Für den jeweiligen Cocktail , Menge usw. dem Model hinzufügen*/
            model.addElement(array[j] + " " + bestand.getZutat().getEinheit() + " " +
                    bestand.getZutat().getName());
            System.out.println(bestand.getMenge());
            }
        }
```

irgendie die klammersetzung noch , denn klappts...

Muss ich die Klammern anders setzen?
ich meine erhöhen tut er schon die mengen .

Weiß einer einen rat, danke


----------



## Spin (7. Jan 2010)

Entschuldigt: hier:


----------



## SlaterB (8. Jan 2010)

ist aktuell eine Frage offen?
möglichst klar ohne umfassendes Mixer-Wissen,
möglichst in einem vollständigen kleinen Testprogramm


----------

