Вам необходимо переопределить метод toString()
для вашего объекта.ChoiceBox
будет использовать это значение для списка опций.
Оттуда вам нужно выбрать значение ChoiceBox
, передав ему ссылку на желаемый Course
из coursesList
.
Ниже приведен простой MCVE для демонстрации:
Course.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();
}
}
Main.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 Stream 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;
}
});
Я считаю, что это не нужно в очень простых приложенияхВпрочем, и не понадобилось это в моих реальных реальных проектах.Однако это «правильный» путь.