Как выбрать данные из выпадающего списка с объектом в качестве значений, используя строку в JavaFX? - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть ComboBox в javafx, который использует объект степени в качестве своих значений.С другой стороны, у меня есть TableView с объектом Thesis в качестве его значений, у которого есть прослушиватель, который возвращает строку степеньName при щелчке по этой строке.Как я могу использовать это «градусное имя», которое я извлек из таблицы, в качестве средства выбора значения из ComboBox с тем же значением degName?

Я использую объект степени в качестве значений в моем ComboBox, потому что я хочу получить всеатрибуты из этого значения, когда я использую его в своей программе.

До сих пор я уже генерировал ComboBox с этим кодом:

private void set_degreeCombo() throws SQLException
{
    ObservableList<Degree> degreeList = DegreeDAO.init_degreeData();

    thesisDegreeCB.setCellFactory(
            (cb) -> new ListCell<Degree>(){
                @Override
                protected void updateItem(Degree item, boolean empty)
                {
                    super.updateItem(item, empty);

                    if(item == null || empty)
                        setText(null);
                    else
                        setText(item.getDegree());
                }
            }
    );

    thesisDegreeCB.setConverter(
            new StringConverter<Degree>() {
                @Override
                public String toString(Degree degree) {
                    return (degree == null) ? null : degree.getDegree();
                }

                @Override
                public Degree fromString(String degreeString) {
                    return null;
                }
            }
    );

    thesisDegreeCB.setItems(degreeList);
    thesisDegreeCB.getSelectionModel().select(0);
}

И у меня есть слушатель в моем TableView:

thesisIDCol.setCellValueFactory(data -> data.getValue().idProperty().asObject());
    thesisTitleCol.setCellValueFactory(data -> data.getValue().titleProperty());
    thesisYearCol.setCellValueFactory(data -> data.getValue().yearProperty());

    thesisTbl.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldVal, newVal) ->
            {
                if(newVal != null)
                {
                    if(newVal.getId() != 0)
                    {
                        thesis = newVal;
                        try {
                            generateThesisData();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    } else {
                        System.out.println("Adding New Data.");
                        clearThesisData();
                    }
                } else
                    clearThesisData();
            }
    );

Я хочу, чтобы, когда я вызываю generateThesisData (), я хотел выбрать ComboBox с тем же степеньюимением, что и degName в моей таблице.

Пока я использую только этот код:

thesisDegreeCB.getSelectionModel().select(thesis.getDegreeID() - 1);

и получаю его индексное значение, что ненадежно, поскольку у меня есть возможность удалить данные из таблицы степеней.

Я надеюсь, что кто-нибудь может мне помочь с этим.Большое спасибо и хорошего дня.

1 Ответ

1 голос
/ 21 сентября 2019

Если Degree реализует equals таким образом, что выдает true при использовании для комбинации данных из TableView и одного из элементов в ComboBox, проблем нет.Просто передайте элемент для выбора.

(Кстати: использование ComboBox.setValue немного более кратко, чем использование модели выбора. Я предпочитаю устанавливать значение таким образом.)

thesisDegreeCB.setValue(theDegreeFromTableViewItem);

В противном случае вам необходимо найти соответствующий элемент среди элементов комбинированного списка (при условии, что они уже инициализированы):

thesisDegreeCB.setValue(thesisDegreeCB.getItems().stream()
                            .filter(degree -> theDegreeFromTableViewItem.getDegree().equals(degree.getDegree()))
                            .findFirst().orElse(null));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...