Заполните комбинированный список Java FX списком <String> - PullRequest
0 голосов
/ 17 декабря 2018

У меня проблемы с заполнением comboBox в JavaFX со значениями в списке.Я очень хорошо разбираюсь в разработке пользовательского интерфейса, поэтому ничего из того, что я нашел в Интернете, не помогло мне.Теперь у меня есть Class myClass с методом getNames(), который возвращает List<String>.Теперь мне нужно, чтобы имена из этого метода выбирались из выпадающего меню.Я пытался что-то вроде этого в моем контроллере:

ObservableList<String> options = FXCollections.observableArrayList(myClass.getNames());

@FXML
final ComboBox comboBox = new ComboBox(options);

, но когда я запускаю свою программу, мой comboBox все еще пуст.Конечно, я также поместил fx:id = "comboBox" в файл .fxml.Я что-то пропустил или должен сделать это совершенно другим методом?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

С Создание пользовательских интерфейсов JavaFX с использованием FXML |CalliCoder :

Загрузчик FXML создает экземпляр класса контроллера, внедряет поля, определенные в классе контроллера, объектами, созданными из документа fxml, а затем вызывает метод initialize () контроллера.

И

Аннотация @FXML обязательна для закрытых полей-членов класса контроллера, иначе внедрение поля не будет работать.Однако это может быть опущено для открытых полей.


С помощью приведенного ниже кода, как указано в вашем вопросе, вы пытаетесь установить это поле, но после этого оно переопределяется FXMLLoader.

@FXML
final ComboBox comboBox = new ComboBox(options);

Вы должны инициализировать переменную comboBox примерно так:

@FXML
private ComboBox comboBox;

И затем (после того, как она была введена FXMLLoader) установить элементыэто ComboBox в этом методе:

@FXML
private void initialize() {

}
0 голосов
/ 17 декабря 2018

Ваш ComboBox помечен @FXML, что означает, что экземпляр будет введен FXMLLoader.Этот внедренный экземпляр заменит созданный вами экземпляр.Вместо этого вы должны заполнить ComboBox из initialize метода (см. Введение в FXML ).

import javafx.scene.control.ComboBox;

public class Controller {

    @FXML 
    private ComboBox<String> comboBox;

    @FXML
    private void initialize() {
        // Must declare myClass instance somewhere
        comboBox.getItems().setAll(myClass.getNames());
    }

}

Обратите внимание, что я также сделал ComboBoxуниверсальный (и не final). Избегайте использования необработанных типов .


Несмотря на то, что вышеприведенное верно, использование final усложняет ситуацию.Из некоторого быстрого тестирования выясняется, что FXMLLoader не пытается вводить поля final (что имеет смысл).Однако созданный вами ComboBox не тот, который был добавлен в граф сцены.Другими словами, FXMLLoader все еще создает свой собственный ComboBox, который используется для построения графического интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...