
JavaFx ChoiceBox mit Objekten
Hier eine kleines Beispiel wie man mit JavaFx ChoiceBoxen mit Inhalten füllen kann.
Nachdem ich Tagelang an diesem Ding Festhing hat mir ein User im Java-Forum geholfen das Rätsel zu lösen. Vielen Dank dzim
Als Szenario: Man bekommt eine Liste<object> von Irgendwas zurück.
Beispielsweise durch einen Java Web Service oder einer JPA Methode.
Jedenfalls kann man nicht die toString methode nutzen.
Jetzt möchte man eine ChoiceBox in JavaFx mit Inhalten füllen. Dabei sollen einfach die Objekte in die Liste geladen werden um diese dann später weiter zu verarbeiten. Wenn man die Objekte direct einlädt dann wird nur die ObjektId angezeigt womit kein Mensch was anfangen kann. Deshalb brauchen wir einen converter der die Anzeige so verändert das am ende eine brauchbare Liste herauskommt.
Die Liste wird in diesem Beispiel durch ein Java XML Service generiert.
Die Objekte die in der ChoiceBox stehen
FxmlController.CLASS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class CaseEditController implements Initializable { //Die ChoiceBox und Ihr fx:id Feld. @FXML private ChoiceBox<WorkType> joWorktype; public void initialize(URL url, ResourceBundle rb) { //Das Objekt ist nur dazu da, die liste zu bekommen. //Für andere Fälle wäre das egal! CaseManagerService csm = new CaseManagerService(); CaseManager cm = csm.getCaseManagerPort(); //Hier wird ein Converter erzeugt und dann die Liste übergeben. joWorktype.setConverter(new ConverterWorkType()); joWorktype.getItems().addAll(cm.getAllworkTypes()); } //Irgentwo soll dann die Liste ausgelesen werden: irgendeinObjekt.setId(joWorktype.getSelectionModel().getSelectedItem().getId()); } |
Damit das klappt braucht es einen Controller:
Der Converter ist hier eine eigene Klasse, die die Aufgabe hat den String so zu Konvertieren das nicht einfach die ID der Objekte in der Liste als Auswahl in der Liste steht sondern ein bestimmtes Feld der Objekte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class ConverterWorkType extends StringConverter<WorkType> { Map<String, WorkType> mapWorkType = new HashMap<String, WorkType>(); @Override public String toString(WorkType w) { mapWorkType.put(w.getName(), w); return w.getName(); } @Override public WorkType fromString(String s) { return mapWorkType.get(s); } } |