Tienes 2 enfoques:
1. Simplemente reemplazar el método toString()
en su clase de modelo de datos. Ejemplo:
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);
}
}
Tenga en cuenta que overriden toString() de la clase Employee. clave (valor real) del cuadro combinado será el Employee
instancia y al valor de visualización employee.toString()
en este caso.
2. El segundo enfoque es establecer la propiedad cellFactory del cuadro combinado.
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);
}
}
};
}
});
Este enfoque proporciona un control más poderoso sobre la representación de células. No puede simplemente formatear el valor de visualización, sino también incluir cualquier nodo (control) en la celda (botón en este caso) y agregar alguna lógica de visualización (item.getSalary()? "": "") También. El valor real sigue siendo el mismo, es decir, instancia de empleado.
¿Ha tenido un vistazo a [el tutorial en los cuadros combinados] (http://docs.oracle.com/javafx/2/ui_controls/combo-box.htm)? – assylias
@assylias - Sí, lo hice. No menciona nada sobre la creación de un cuadro combinado con un par de valores clave, solo un cuadro combinado simple con algunos elementos. –