我想将我的业务逻辑绑定到javafx中的组合框。
例如,假设我有CustomObject
有孩子我可以使用返回getChildren()
的{{1}}方法获得。
现在我想将该集合绑定到dropbox,以便我的业务对象将在某个字符串适配器的帮助下出现在组合中。
我看到有可观察的列表我可以使用,但我目前的商业模式并没有使用它们....
那么组合如何跟踪我的商业模式呢?
答案 0 :(得分:0)
可能是这样的事情:
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
对象(而不仅仅是名称)。