小编典典

JavaFX 2中的组合框键值对

java

我刚刚开始学习JavaFX2。
现在,我正在尝试构建示例应用程序。然后我陷入了组合框。
我没有在JavaFX中找到对组合框的键值对的任何引用。http://docs.oracle.com/javafx/2/api/index.html
的组合框javadoc 对键值对的描述不多。

如何创建包含显示值和实际值不同的项目的组合框?


阅读 217

收藏
2020-09-16

共1个答案

小编典典

您有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类的重写的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实例。

2020-09-16