使用对象列表时设置选择框值

时间:2018-10-22 18:22:44

标签: java javafx observable

我正在尝试设置我的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;
}

}

1 个答案:

答案 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

这是结果:

enter image description here


  

编辑

要按名称选择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:

为了稳定 kleopatra的批评,我将发布一种更“正确”的方法来更新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)

但是,我确实认为在非常简单的应用程序中不需要这样做,并且在我自己的真实项目中也不需要。但是,这是“正确”的方式。