# JavaFX ComboBox String setzen



## didi577 (28. Apr 2017)

Hallo Experten,

ich möchte in einer GUI erreichen dass nach einem Klick auf einen Listview Eintrag in einer Combobox ein bestimmter Wert gesetzt wird. Die Combobox wird beim Fensterstart geladen. Klappt. Bei Klick auf den Listview Eintrag wird ein Objekt aus einer MySQL geladen. Die ID (offices_id)  und die Bezeichnung (town) sind Insatanzvariablen des Objekts. Der Wert town entspricht einem der Einträge der Combobox. Dieser Wert soll gesetzt werden. Sysout liefert den richtigen Wert für town. In der ComboBox wird aber der Wert nicht ausgewählt. Mit diesem Befehl will ich den Wert der Combobox setzen:

```
cbOffice.setId(((EmployesObject) lvEmploye
                           .getSelectionModel().getSelectedItem()).getTown());
```

Habe auch schon mit setValue etc probiert aber es klappt nicht.
Kann mir jemand helfen?


----------



## Harry Kane (28. Apr 2017)

1. setValue sollte die richtige Methode sein.
2. Ich rate mal, dass der Rückgabewert von getTown nicht in den items der ComboBox enthalten ist.


----------



## didi577 (30. Apr 2017)

zu 2. getTown liefert mir die Strings auf die Konsole. Sie entsprechen auch den Items

setValue bringt den Fehler "The method setValue(OfficesObject) in the Type ComboBoxBase<OfficesObject> Is not applicable for the arguments (String)

ich habe noch die ID aus der offices Tabelle aber ein int wird auch abgewiesen


----------



## Harry Kane (30. Apr 2017)

Grmpf. Im Prinzip ist dieser Thread eine Wiederholung von dem hier:
http://www.java-forum.org/thema/javafx-combobox-abfrage-aus-mysql.177228/
So wie es aussieht, hast du immer noch Probleme mit dem Konzept von Variablentypen. 


didi577 hat gesagt.:


> zu 2. getTown liefert mir die Strings auf die Konsole. Sie entsprechen auch den Items


Bitte, bitte drücke dich präzise aus. Welchen Typ hat der Rückgabewert von getTown()? String oder was anderes? Die "Ausgabe auf der Konsole" oder irgendwelche "items", denen die Strings entsprechen, hat mit der Frage nach dem Typ von getTown() NICHTS zu tun, sondern ist nur verwirrendes blabla.
Die Fehlermeldung suggeriert, dass der Rückgabewert dieses Bandwurms

```
((EmployesObject) lvEmploye.getSelectionModel().getSelectedItem()).getTown();
```
tatsächlich Strings zurückliefert, aber deine ComboBox Objekte des Typs OfficesObject enthält.
Wie man das lösen kann? Keine Ahnung. Dazu fehlt viel zuviel Kontext.
Ich sehe auch keinen Sinn darin, in einer ComboBox, die OfficesObjects enthält, eine Town auswählen zu wollen, egal von welchem Typ Town auch immer sein mag. Genauso könnte man in einer Liste mit Auto-Objekten eine Garage auswählen wollen. Dass es da irgendeinen Bezug geben kann, na gut, aber wie der herzustellen ist: k. A.


----------



## didi577 (30. Apr 2017)

getTown() liefert einen String

was will ich:

habe eine GUI deren Widgets mit Werten eines EmployesObject gefüllt wird

eines der Widgets ist eine ComBobox mit OfficesObjects, diese werden beim Fensterstart geladen

wenn ich aus der Listview ein EmployeObject auswähle soll die Combox das im EmployeObject gespeicherte Item anzeigen (gespeichert wird die offices_id)

da sich das Office zum Employe immer wieder ändern kann wird immer wieder ein anderes Item zu einem Employe gespeichert.

town ist der Wert aus dem OfficesObject der in der ComboBox angezeigt wird

im EmployeObject ist die ID des OfficesObject gespeichert, beim Laden des EmployeObjects soll in der CombBox das Item mit der gespeicherten ID default angezeigt werden.


die Instanzvariablen des OfficesObject:

```
public class OfficesObject {
   
   private int offices_id;
   private String street;
   private int zipcode;
   private String town;
```

hier die Instanzen dazu im EmployesObject:

```
public class EmployesObject {
.....
   String town;
   int offices_id;

....
```

offices_id ist ein Foreignkey in employes

Ich hoffe ich konnte erstmal erläutern wo ich hin möchte


----------



## Meniskusschaden (30. Apr 2017)

Warum orientierst du dich nicht einfach an den Datentypen? Wenn in deiner ComboBox Office-Objekte gespeichert sind, musst du mit setValue() logischerweise auch ein Office-Objekt setzen und keinen String. Und zwar exakt das Office-Objekt, das du auswählen möchtest und nicht irgendeins, dass zufällig gleiche Attributwerte hat. Du könntest das Objekt also suchen, oder du sorgst bereits vorher dafür, dass im Employes-Objekt eine Referenz darauf gehalten wird.


----------



## Harry Kane (30. Apr 2017)

didi577 hat gesagt.:


> wenn ich aus der Listview ein EmployeObject auswähle soll die Combox das im EmployeObject gespeicherte Item anzeigen (gespeichert wird die offices_id)


Nochmal die Bitte um eine präzise Ausdrucksweise. Was ist das "im EmployesObject gespeicherte Item"? Du hast zwei Instanzvariablen von EmployesObject gezeigt, town und offices_id, und keines von beiden kann das "item" sein? Möchtest du, dass bei Auswahl eines EmployesObject aus der Listview derjenige OfficesObject-Eintrag in der ComboBox ausgewählt wird, dessen offices_id mit der offices_id des EmployesObject übereinstimmt?
Wenn ja: warum machst du in deinem Eingangspost mit getTown() rum?
Und warum speicherst du keine "richtiges" OfficesObject in deinem EmployesObject, sondern nur einen Index?
BTW: Den Namensbestandteil "Object" finde ich komplett überflüssig. Warum nicht einfach "Offices" oder, da es sich ja um ein einzelnes Büro handelt, "Office" ?


----------



## Meniskusschaden (30. Apr 2017)

Meniskusschaden hat gesagt.:


> Und zwar exakt das Office-Objekt, das du auswählen möchtest und nicht irgendeins, dass zufällig gleiche Attributwerte hat.


Ich glaube, das ist nicht ganz korrekt. Es genügt wohl, wenn sie gleich (im Sinne von equals) sind.


----------



## Harry Kane (30. Apr 2017)

Meniskusschaden hat gesagt.:


> Ich glaube, das ist nicht ganz korrekt. Es genügt wohl, wenn sie gleich (im Sinne von equals) sind.


Solange nicht in einem anderen Dialog auch noch Office-Objekte rumschwirren, dort umbenannt werden können, und dann vom Benutzer erwartet wird, das die Namensänderung berücksichtigt wird, wenn ein neuer Employe ausgewählt wird und der Benutzer dann erwartet, dass der richtige Name des zugehörigen Office-Objektes angezeigt wird.


----------



## Meniskusschaden (30. Apr 2017)

Sehe ich auch so. War auch nicht als Handlungsempfehlung gedacht, sondern ich wollte meine Aussage nicht so unkorrigiert stehen lassen.


----------



## didi577 (1. Mai 2017)

Harry Kane hat gesagt.:


> Möchtest du, dass bei Auswahl eines EmployesObject aus der Listview derjenige OfficesObject-Eintrag in der ComboBox ausgewählt wird, dessen offices_id mit der offices_id des EmployesObject übereinstimmt?


genau das will ich


Harry Kane hat gesagt.:


> Und warum speicherst du keine "richtiges" OfficesObject in deinem EmployesObject, sondern nur einen Index?


habe ich so bislang noch nie gemacht, da weiß ich noch nicht wie es geht


Harry Kane hat gesagt.:


> Wenn ja: warum machst du in deinem Eingangspost mit getTown() rum?


das war mein erster Ansatz da ja getTown() genau den Wert liefert der auch in der Combobox steht. Hier habe ich aber das Typproblem Sting vs. Item (Objekt)


----------



## Harry Kane (1. Mai 2017)

didi577 hat gesagt.:


> das war mein erster Ansatz da ja getTown() genau den Wert liefert der auch in der Combobox steht. Hier habe ich aber das Typproblem Sting vs. Item (Objekt)


Verstehe ich deinen Gedankengang richtig: Es gib eine Klasse Office (die Mehrzahl und das unsinnige Suffix Objects lasse ich weg) und eine Klasse Employee. Beide haben eine Variable namens "town" vom Typ String. Entweder die cbOffice oder die Office-Klasse selber sind offenbar so gestrickt, dass in cbOffice nur die town des Offices angezeigt wird. Wenn jetzt in der lvEmploye ein Employe ausgewählt wird, hast du erwartet, dass du dir die town des Employes (ein String) holen kannst und damit den value einer ComboBox setzen kannst, die gar keine Strings enthält, sondern Office-Instanzen?
Wie schon in mehreren deiner Beiträge angemerkt, fehlen dir nicht nur Grundlagenkenntnisse, sondern auch ein Grundlagenverständnis. Einigermassen gezieltes Suchen ersetzt du durch rumprobieren mit dem Ergebnis, dass du eine Methode der cbOffice aufrufst, die einen int entgegennimmt, weil du ja irgendwoher einen int bekommst und damit das ausgewählte Objekt in cbOffice setzen willst.


didi577 hat gesagt.:


> habe ich so bislang noch nie gemacht, da weiß ich noch nicht wie es geht


Du holst dir deine Objekte aus einer db, richtig? Dann wird es bei der Variante mit den ids bleiben.

So kannst du dein Problem lösen:
1. Aus dem in lvEmploye ausgewählten Objekt die offices_id auslesen.
2. Über alle Einträge in cbOffice iterieren, jedes Element ggf. in den richtigen Typ (Office oder wenn du bei deinem Klassennamen bleiben möchtest, OfficesObject) casten, die office_id bestimmen, mit der office_id aus 1. vergleichen, und bei Gleichheit das Element in cbOffice auswählen und die Iteration beenden.


----------



## didi577 (1. Mai 2017)

eurem Rat folgend habe ich mal etwas weiter probiert:

im EmployesObject gibt jetzt die Variable;

```
OfficesObject office;
public OfficesObject getOffice() {
       return office;
   }

   public void setOffice(OfficesObject office) {
       this.office = office;
   }
```

welchen Typ vergebe ich für ein Object in der Datenbank? Ist das ein Blob? 
beim Laden eines Listview Objects habe ich jetzt die Zeile:

```
cbOffice.setValue(((EmployesObject) lvEmploye
                   .getSelectionModel().getSelectedItem()).getOffice());
```

jetzt passt der Typ schonmal

in der sql Abfrage steht:

```
while (rs.next()) {
...
employesObject.setOffice((OfficesObject) rs.getObject("office"));
...
```


beim Speichern habe ich im Aufruf:

```
cbOffice.getSelectionModel().getSelectedItem()
```
und in der mysql:

```
OfficesObject newOffice = office;
pst.setObject(12, newOffice);
```

bevor ich weiter mache...bin ich hier auf dem richtigen Weg?


----------



## Harry Kane (1. Mai 2017)

didi577 hat gesagt.:


> bin ich hier auf dem richtigen Weg?


MMn nein. Sowohl die Offices als auch Employes sind ja beides einfache Datenobjekte, bestehend aus ein paar Strings und ints. Die Offices jetzt als Blob zu speichern, führt nur zu Mehraufwand, weil dein Code wahrscheinlich an mehreren Stellen abgeändert werden muss, und vor allem dazu, dass jeder Employe seine eigene Instanz von Office hat, auch wenn eigentlich das gleiche Office gemeint ist.


----------



## didi577 (1. Mai 2017)

alles klar, 


Harry Kane hat gesagt.:


> Dann wird es bei der Variante mit den ids bleiben.
> 
> So kannst du dein Problem lösen:
> 1. Aus dem in lvEmploye ausgewählten Objekt die offices_id auslesen.
> 2. Über alle Einträge in cbOffice iterieren, jedes Element ggf. in den richtigen Typ (Office oder wenn du bei deinem Klassennamen bleiben möchtest, OfficesObject) casten, die office_id bestimmen, mit der office_id aus 1. vergleichen, und bei Gleichheit das Element in cbOffice auswählen und die Iteration beenden.


ich werde mich hier versuchen, vielen Dank bis hierhin


----------



## didi577 (1. Mai 2017)

ich hisse die weiße Flagge ...
1. ist klar 
(((EmployesObject) lvEmploye
                           .getSelectionModel().getSelectedItem()).getOffice())
liefert mir die ID

2. muss ich sicher eine for Schleife bauen und darin eine if Bedingung

kannst du mir hier nochmal auf die Sprünge helfen...


----------



## Harry Kane (1. Mai 2017)

didi577 hat gesagt.:


> 1. ist klar
> (((EmployesObject) lvEmploye
> .getSelectionModel().getSelectedItem()).getOffice())
> liefert mir die ID


1. ist nix klar. Der Bandwurm liefert dir das Office des Employees und KEINE id. Zum wiederholten Mal würfelst du hier nicht zusammengehörende Variablen durcheinander.
Zu 2. Ja, genau. Eine for-Schleife und eine if-Bedingung. So z. B.:

```
int id = ((EmployesObject) lvEmploye.getSelectionModel().getSelectedItem()).getOfficesId();
for(OfficesObject oo: cbOffice.getItems()){
    if (oo.getOfficesId() == id){
        cbOffice.setValue(oo);
        break;
    }
}
```
Das sollte unter der Annahme, dass die offices_id von OfficesObject und EmployesObject über den getter getOfficesId() zugänglich sind, funktionieren. Ist aber nicht getestet, da dazu ein Klassenkontext notwendig wäre. Du willst ihn nicht posten, und zum selber schreiben hatte ich keine Lust.


----------



## didi577 (1. Mai 2017)

Danke schonmal!!!!

habe deinen Code implementiert, keine Fehler aber leider auch kein Ergebnis, in der ComboBox bewegt sich nix, so wie vorher
int id liefert 0 auf der Konsole, oo bringt gar nichts auf die Konsole, in der Box sind definitiv drei Einträge enthalten


Harry Kane hat gesagt.:


> Das sollte unter der Annahme, dass die offices_id von OfficesObject und EmployesObject über den getter getOfficesId() zugänglich sind, funktionieren.


getOffices_id ist in beiden Klassen zugänglich
sti


Harry Kane hat gesagt.:


> Du willst ihn nicht posten


stimmt nicht , was brauchst du?


----------



## didi577 (1. Mai 2017)

bin etwas weiter, habe in deinem Code 
int id = ((EmployesObject) lvEmploye.getSelectionModel().getSelectedItem()).getOfficesId();

durch

int id = ((EmployesObject) lvEmploye.getSelectionModel().getSelectedItem()).getOffice(); ersetzt und bekomme jetzt den richtigen Wert in der Combobox angezeigt

in der Tabelle Employes speicher ich die ID der Offices in der Spalte office


----------



## Harry Kane (1. Mai 2017)

didi577 hat gesagt.:


> int id liefert 0 auf der Konsole


Dann ist der Rückgabewert von getOfficesId() der Klasse EmployesObject murks. 


didi577 hat gesagt.:


> oo bringt gar nichts auf die Konsole


Wieder so ein nichtsagender Schwafelsatz. Ok, ich bin raus.


didi577 hat gesagt.:


> int id = ((EmployesObject) lvEmploye.getSelectionModel().getSelectedItem()).getOffice(); ersetzt und bekomme jetzt den richtigen Wert in der Combobox angezeigt


Dann gibt getOffice() der Klasse EmployesObject offenbar das richtig zurück, was getOfficesId() vermurkst zurückgibt. Man könnte jetzt fragen, warum getOffice() und getOfficeId() zwar beide ints zurückgeben, aber nicht dieselben, aber da dir das offenbar egal ist, ist es mir das auch.
Clean design sieht komplett anders aus.


----------



## didi577 (2. Mai 2017)

Harry Kane hat gesagt.:


> Man könnte jetzt fragen, warum getOffice() und getOfficeId() zwar beide ints zurückgeben, aber nicht dieselben, aber da dir das offenbar egal ist, ist es mir das auch.
> Clean design sieht komplett anders aus.


da werde ich jetzt ein paar Namensanpassungen vornehmen

vielen Dank für deine Hilfe und Designhinweise


----------

