我正在尝试设置我的choiceBox的值。
在使用像这样的纯字符串时可以使用:
choiceBox.getItems.setAll(FXCollections.observableArrayList("a","b","c"));
choiceBox.setValue("a");
但是当使用Class来填充和设置choiceBox时,它不会设置值(并且没有错误)
ObservableList<Course> items = FXCollections.observableArrayList();
items.add(Course.getAll());
choiceBox.getItems().setAll(items);
choiceBox.setValue(schedule.getCourse());
还尝试使用shedule.getCourse().toString()
,因为choiceBox使用toString方法显示课程。
ChoiceBox
需要我对象的哪一部分?
我的课程:
public class Course {
// Property Value Factory
public static final String PVF_NAME = "name";
private String name;
// == constructors ==
public Course(String name) {
this.name = name;
}
// == public methods ==
@Override
public String toString() {
return name;
}
public static Course fromString(String line) {
return new Course(line);
}
// Getters & Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
答案 0 :(得分:3)
您需要为对象覆盖toString()
方法。 ChoiceBox
将使用该值作为选项列表。
从那里,您需要通过将ChoiceBox
的引用传递给Course
中所需的coursesList
来选择import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Course {
private StringProperty courseName = new SimpleStringProperty();
public Course(String courseName) {
this.courseName.set(courseName);
}
public String getCourseName() {
return courseName.get();
}
public StringProperty courseNameProperty() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName.set(courseName);
}
// The ChoiceBox uses the toString() method of our object to display options in the dropdown.
// We need to override this method to return something more helpful.
@Override
public String toString() {
return courseName.get();
}
}
的值。
下面是一个简单的MCVE演示:
Course.java:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple interface
VBox root = new VBox(5);
root.setPadding(new Insets(10));
root.setAlignment(Pos.CENTER);
// Create the ChoiceBox
ChoiceBox<Course> cbCourses = new ChoiceBox<>();
// Sample list of Courses
ObservableList<Course> coursesList = FXCollections.observableArrayList();
// Set the list of Course items to the ChoiceBox
cbCourses.setItems(coursesList);
// Add the ChoiceBox to our root layout
root.getChildren().add(cbCourses);
// Now, let's add sample data to our list
coursesList.addAll(
new Course("Math"),
new Course("History"),
new Course("Science"),
new Course("Geography")
);
// Now we can select our value. For this sample, we'll choose the 3rd item in the coursesList
cbCourses.setValue(coursesList.get(2));
// Show the Stage
primaryStage.setWidth(300);
primaryStage.setHeight(200);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
Main.java:
Course
这是结果:
编辑
要按名称选择Course
,您将需要一个辅助方法来从coursesList
中检索匹配的 private Course getCourseByName(String name, List<Course> courseList) {
// This basically filters the list based on your filter criteria and returns the first match,
// or null if none were found.
return courseList.stream().filter(course ->
course.getCourseName().equalsIgnoreCase(name)).findFirst().orElse(null);
}
。
使用Java 8 Stream API:
private Course getCourseByName(String name, List<Course> courseList) {
// Loop through all courses and compare the name. Return the Course if a match is found or null if not
for (Course course : courseList) {
if (name.equalsIgnoreCase(course.getCourseName())) {
return course;
}
}
return null;
}
Java以前的版本:
cbCourses.setValue(getCourseByName("History", coursesList));
您现在可以使用Course
编辑#2:
为了稳定toString()
对象的显示值。尽管我认为在大多数简单应用程序中覆盖toString()
没什么错,尤其是如果您以某种方式将其设计为只需要一个对象的字符串表示形式,但我将添加另一种方法在这里。
不是直接在您的Course
对象中覆盖ComboBox
方法,而是在 cbCourses.setConverter(new StringConverter<Course>() {
@Override
public String toString(Course object) {
return object.getCourseName();
}
@Override
public Course fromString(String string) {
return null;
}
});
本身上设置转换器:
=IFERROR(INDEX($B$3:$G$9,MATCH(K2,$A$3:$A$9,0),MATCH(L2,$B$1:$G$1,0)),0)
但是,我确实认为在非常简单的应用程序中不需要这样做,并且在我自己的真实项目中也不需要。但是,这是“正确”的方式。