Sie haben zwei Ansätze:
1. Überschreiben Sie einfach die toString()
-Methode in Ihrer Datamodel-Klasse. Beispiel:
public class Demo extends Application {
private final ObservableList<Employee> data =
FXCollections.observableArrayList(
new Employee("Azamat", 2200.15),
new Employee("Veli", 1400.0),
new Employee("Nurbek", 900.5));
@Override
public void start(Stage primaryStage) {
ComboBox<Employee> combobox = new ComboBox<>(data);
combobox.getSelectionModel().selectFirst(); // Select first as default
combobox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Employee>() {
@Override
public void changed(ObservableValue<? extends Employee> arg0, Employee arg1, Employee arg2) {
if (arg2 != null) {
System.out.println("Selected employee: " + arg2.getName());
}
}
});
StackPane root = new StackPane();
root.getChildren().add(combobox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
public static class Employee {
private String name;
private Double salary;
@Override
public String toString() {
return name + " (sal:" + salary + ")";
}
public Employee(String name, Double salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
}
public static void main(String[] args) {
launch(args);
}
}
Beachten Sie die overriden toString() der Employee-Klasse. Der Schlüssel der Combobox (tatsächlicher Wert) ist die Employee
Instanz und der Anzeigewert ist in diesem Fall employee.toString()
.
2. Der zweite Ansatz besteht darin, die Eigenschaft cellFactory der Combobox zu setzen.
combobox.setCellFactory(new Callback<ListView<Employee>, ListCell<Employee>>() {
@Override
public ListCell<Employee> call(ListView<Employee> arg0) {
return new ListCell<Employee>() {
private final Button btn;
{
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
btn = new Button();
}
@Override
protected void updateItem(Employee item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
btn.setStyle(item.getSalary() > 1000 ? "-fx-base:red" : "-fx-base: green");
btn.setText(item.getName() + "=" + item.getSalary());
setGraphic(btn);
}
}
};
}
});
Dieser Ansatz gibt eine leistungsfähigere Kontrolle über Cell Rendering. Sie können nicht nur den Anzeigewert formatieren, sondern auch einen beliebigen Knoten (Steuerung) in die Zelle einfügen (in diesem Fall die Schaltfläche) und eine Anzeigelogik hinzufügen (item.getSalary()? "": ""). Der tatsächliche Wert bleibt gleich, dh Mitarbeiterinstanz.
Haben Sie sich [das Tutorial zu Kombinationsboxen] (http://docs.oracle.com/javafx/2/ui_controls/combo-box.htm) angesehen? – assylias
@assylias - Ja, tat ich. Es wird nichts über das Erstellen einer Kombinationsbox mit Schlüsselwertpaar erwähnt, sondern nur eine einfache Kombinationsbox mit einigen Elementen. –