为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ibeautiful 2021-12-01 18:58:43
我正在尝试设置我的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 Factorypublic static final String PVF_NAME = "name";private String name;// == constructors ==public Course(String name) {    this.name = name;}// == public methods ==@Overridepublic String toString() {    return name;}public static Course fromString(String line) {    return new Course(line);}// Getters & Setterspublic String getName() {    return name;}public void setName(String name) {    this.name = name;}}
查看完整描述

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();

    }

}

结果如下:

//img1.sycdn.imooc.com//61a755800001ed6902960240.jpg

编辑


要按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;

        }

    });

然而,我确实认为这在非常简单的应用程序中是不必要的,并且在我自己的实际项目中不需要它。然而,这是“正确”的方式。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信