我刚刚开始学习JavaFX2。 现在,我正在尝试构建示例应用程序。然后我陷入了组合框。 我没有在JavaFX中找到对组合框的键值对的任何引用。http://docs.oracle.com/javafx/2/api/index.html上 的组合框javadoc 对键值对的描述不多。
如何创建包含显示值和实际值不同的项目的组合框?
您有2种方法: 1.简单地覆盖toString()数据模型类中的方法。例:
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类的重写的toString()。组合框的键(实际值)将是Employee实例,employee.toString()在这种情况下显示值是。 2.第二种方法是设置组合框的cellFactory属性。
Employee
employee.toString()
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实例。