Установка значения поля выбора при использовании списка объектов - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь установить значение для моего choiceBox.

Это работает при использовании простых строк, например:

choiceBox.getItems.setAll(FXCollections.observableArrayList("a","b","c"));
choiceBox.setValue("a");

Но это не устанавливает значение (и нетошибка) при использовании класса для заполнения и установки 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 голосов
/ 22 октября 2018

Вам необходимо переопределить метод 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();
    }
}

Вот результат:

enter image description here


РЕДАКТИРОВАТЬ

Чтобы выбрать 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;
        }
    });

Я считаю, что это не нужно в очень простых приложенияхВпрочем, и не понадобилось это в моих реальных реальных проектах.Однако это «правильный» путь.

...