Java FX 8 ObservableList
Willemers Informatik-Ecke
Eine ObservableList wird bei Java FX als Basis für die Einträge in ChoiceBox, ComboBox oder ListView verwendet. Typischerweise wird sie mit einem String-Array initialisiert, das die Einträge enthält.

public class FxChoiceBox extends Application {

    @Override
    public void start(Stage hauptStage) {
        ObservableList<String> datenliste
            = FXCollections.observableArrayList("ARD", "ZDF", "N3");
        ChoiceBox<String> choice = new ChoiceBox<String>(datenliste);
        VBox pane = new VBox();
        pane.getChildren().add(choice);
        Scene scene = new Scene(pane, 250, 80);
        hauptStage.setScene(scene);
        hauptStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Eigene Klassen statt nur Strings

Eine ObservableList kann nicht nur Strings verwalten, wie die Generics-Definition schon vermuten lässt. Darum soll das Beispiel etwas komplizierter werden. In der Liste wird eine eigene Klasse abgelegt.
public class MeineKlasse {
    private final int key;
    private final String wert;

    public MeineKlasse(int key, String wert) {
        this.key = key;
        this.wert = wert;
    }

    public int getKey() {
        return key;
    }

    public String toString() {
        return wert;
    }
}
Die Methode toString sollte die Repräsentation eines Objekts zurückgeben, so wie sie in der Liste erscheinen soll.

Die Elemente können in einer ObservableList vom Typ MeineKlasse gehalten werden, die als ArrayList in der Lage ist, beliebige Typen aufzunehmen. Anschließend wird sie Schritt für Schritt gefüllt. Die ArrayList wird dem Konstruktor der ChoiceBox übergeben.

Änderungen an der ObservableList während des Programms werden sofort auf die ChoiceBox durchschlagen. Die Liste ist also das Datenmodell für die ChoiceBox. Dasselbe Prinzip werden Sie auch bei anderen Kontrollementen sehen.

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FxChoiceBox extends Application {

    @Override
    public void start(Stage hauptStage) {
        ObservableList<MeineKlasse> meineDaten
                = FXCollections.observableArrayList();
        meineDaten.add(new MeineKlasse(10, "Aktiv"));
        meineDaten.add(new MeineKlasse(20, "Faul"));
        meineDaten.add(new MeineKlasse(30, "Tot"));
        ChoiceBox<MeineKlasse> choiceBox
                = new ChoiceBox<MeineKlasse>(meineDaten);
        choiceBox.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                ChoiceBox<MeineKlasse> cb
                        = (ChoiceBox<MeineKlasse>) event.getSource();
                MeineKlasse mk = cb.getValue();
                int index = cb.getSelectionModel().getSelectedIndex();
                System.out.println("index: "+index+" Wert: "+mk);
            }
        });
        VBox pane = new VBox();
        pane.getChildren().add(choiceBox);
        Scene scene = new Scene(pane, 250, 80);
        hauptStage.setScene(scene);
        hauptStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}