1 回答
TA贡献2003条经验 获得超2个赞
您需要覆盖toString()对象的方法。在ChoiceBox将使用该值的选项列表。
从那里,你需要选择的值ChoiceBox通过传递一个refernece所需Course从coursesList。
下面是一个简单的 MCVE 来演示:
课程.java:
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();
}
}
主.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();
}
}
结果如下:
编辑
要按Course名称选择一个,您将需要一个辅助方法来Course从coursesList.
使用 Java 8 流 API:
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 版本:
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;
}
您现在可以使用 cbCourses.setValue(getCourseByName("History", coursesList));
编辑#2:
为了稳定kleopatra 的批评,我将发布一种更“正确”的方法来更新Course对象的显示值。虽然我认为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;
}
});
然而,我确实认为这在非常简单的应用程序中是不必要的,并且在我自己的实际项目中不需要它。然而,这是“正确”的方式。
添加回答
举报