2つのアプローチがあります。
1.データモデルクラスのtoString()
メソッドを単にオーバーライドします。例:
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);
}
}
Employeeクラスのoverriden toString()に注意してください。コンボボックスのキー(実際の値)はEmployee
インスタンスになり、この場合は表示値はemployee.toString()
になります。
2つ目の方法は、コンボボックスのcellFactoryプロパティを設定することです。
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);
}
}
};
}
});
この手法は、セルレンダリングをより強力に制御します。表示値をフォーマットするだけでなく、ノード(この場合はボタン)にノード(コントロール)を含め、表示ロジック(item.getSalary()? "": "")を追加することもできます。実際の値は、Employeeインスタンスと同じです。
[コンボボックスのチュートリアル](http://docs.oracle.com/javafx/2/ui_controls/combo-box.htm)をご覧ください。 – assylias
@assylias - そうでした。それは、キー値のペアを持つコンボボックスを作成することについて何も言及していません、その中にいくつかの項目を持つ単純なコンボボックスです。 –