【问题标题】:Content provider for combo box in javafx?javafx中组合框的内容提供程序?
【发布时间】:2015-10-29 08:24:43
【问题描述】:

我想将我的业务逻辑绑定到 javafx 中的组合框。 例如,假设我有一个 CustomObject 有孩子,我可以使用返回 Collection<BusinessObjects>getChildren() 方法获得孩子。

现在我想将该集合绑定到保管箱,以便我的业务对象将在一些字符串适配器的帮助下出现在组合中。

我发现我可以使用一些可观察的列表,但我目前的商业模式不使用它们......

那么组合如何跟踪我的商业模式?

【问题讨论】:

    标签: java combobox javafx


    【解决方案1】:

    大概是这样的:

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.Label;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    
    public class ComboBoxDemo extends Application {
    
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            ComboBox<Student> comboBox = new ComboBox<>();
    
            University university = new University(1, Arrays.asList(new Student(1, "John"),
                    new Student(2, "Joe")));
    
    
            comboBox.setItems(FXCollections.observableArrayList(
                    university.getStudents()
            ));
    
            comboBox.getSelectionModel().select(0);
            Label label = new Label();
    
            comboBox.valueProperty().addListener((observable, oldValue, newValue) -> {
                label.setText(newValue.getId() + " :: " + newValue.getName());
            });
    
            HBox hBox = new HBox();
            hBox.setSpacing(5);
            hBox.setPadding(new Insets(5, 5, 5, 5));
            hBox.getChildren().addAll(comboBox, label);
            primaryStage.setScene(new Scene(hBox, 320, 240));
            primaryStage.show();
        }
    
        private class University {
            int id;
    
            List<Student> students = new ArrayList<>();
    
            public University(int id, List<Student> students) {
                this.id = id;
                this.students = students;
            }
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public List<Student> getStudents() {
                return students;
            }
    
            public void setStudents(List<Student> students) {
                this.students = students;
            }
    
            public void addStudent(Student student) {
                this.students.add(student);
            }
        }
    
        private class Student {
            int id;
            String name;
    
            public Student(int id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public Student() {
            }
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            @Override
            public String toString() {
                return name;
            }
        }
    }
    

    所以我们有一个University 实体,它可以有多个Student 实体。 我们创建University 的实例并用Student 类的实例填充它。然后我们将学生集合设置为ComboBox 并观察valueProperty 的变化。选择后,我们会在Label 中显示有关学生的详细信息。请注意,ComboBox 中显示的内容取决于toString 方法返回的值。在这种情况下,toString 被覆盖以仅返回名称 Student。但是,在选择后,我会得到整个 Student 对象(不仅仅是名称)。

    【讨论】:

    • 来自 ObservableList() 方法的 javadocs:构造一个由指定列表支持的 ObservableList。 ObservableList 实例上的突变操作将报告给已在该实例上注册的观察者。请注意,直接对底层列表进行的突变操作不会报告给任何包装它的 ObservableList 的观察者。这意味着不会显示对大学对象的更改 -> :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多