Заполнить поле выбора, определенное в FXML

Я изучаю javaFX, и моя проблема в том, что у меня простое окно с окном выбора и кнопкой. Это окно определяется через FXML, который также связан с классом контроллера. Я хотел бы знать, как заполнить это поле выбора данными в классе контроллера, потому что использование ссылки @FXML на это поле выбора throwsNullpointerEception

EDIT — добавлен исходный код FXML code

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0"
        prefWidth="320.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="supermarket.ManageWindowCC">
<children>
    <ChoiceBox fx:id="countChoiceBox" layoutX="44.0" layoutY="71.0" prefHeight="25.0" prefWidth="191.0"/>
    <Label layoutX="44.0" layoutY="54.0" text="To change item's count, choose one"/>
    <TextField layoutX="140.0" layoutY="129.0" prefHeight="25.0" prefWidth="24.0"/>
    <Label layoutX="123.0" layoutY="112.0" text="New count"/>
    <Button layoutX="126.1875" layoutY="171.5" mnemonicParsing="false" text="Submit"/>
</children>

Java controller code:

public class ManageWindowCC {
@FXML
private ChoiceBox countChoiceBox;

public void onChangeCountClick(ActionEvent actionEvent) {

    try {
        Parent root = FXMLLoader.load(getClass().getResource("ChangeCount.fxml"));
        Stage newStage = new Stage();
        newStage.setTitle("Change item's count");
        newStage.setScene(new Scene(root, 320, 240));
        newStage.show();
        countChoiceBox = new ChoiceBox();
        countChoiceBox.setItems(FXCollections.observableArrayList("One","Two","Three"));

    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Спасибо за вашу помощь и время


person user2151486    schedule 14.04.2014    source источник
comment
Пожалуйста, отредактируйте свой вопрос и добавьте код, например. fxml и класс Controller, где вы ссылались на Choicebox.   -  person Patrick    schedule 14.04.2014


Ответы (2)


Как это исправить

Удалите строку countChoiceBox = new ChoiceBox();, и все будет работать нормально, при условии, что в вашем приложении нет других ошибок.

Программа будет использовать ссылку на countChoiceBox, который является частью иерархии узлов, созданной FXMLLoader и установленной в вашей сцене.

Что происходит

Загрузка нового FXML в onChangeCountClick будет:

  1. Создайте новый контроллер supermarket.ManageWindowCC.
  2. Создайте иерархию узлов на основе определения FXML.
  3. Одним из узлов в иерархии будет ChoiceBox.
  4. ChoiceBox, который загрузчик FXML автоматически создает для вас, будет назначен элементу countChoiceBox.
  5. Затем вы берете иерархию узлов, назначенных root, и добавляете ее в свою новую сцену на новой сцене.

Итак, после загрузки FXML countChoiceBox инициализируется пустым ChoiceBox, созданным вашим FXMLLoader.

Это все хорошо до сих пор. . .

Затем вы делаете (неправильно) пишете:

countChoiceBox = new ChoiceBox();

Эмпирическое правило, которое вы нарушаете, заключается в том, что => никогда не используйте new для создания присвоения значения членам с тегом @FXML.


Также см. похожий пример для заполнения ComboBox с помощью FXML (хотя в этом примере используется ComboBox и заполняется его данные непосредственно в FXML, поэтому они напрямую не применимы к вашей ситуации).

person jewelsea    schedule 14.04.2014
comment
Спасибо за действительно умное объяснение. Теперь я знаю, что этот код должен работать. Исключение все еще существует, но, как вы упомянули, в остальной части класса контроллера должна быть какая-то другая ошибка. Я еще не понял всех механизмов и отношений между окнами. Чтобы быть более конкретным: это окно должно отображаться после нажатия кнопки, расположенной на другом этапе, но эти этапы используют один и тот же контроллер ManageWindowCC. Может быть, это причина исключения Nullpointer - person user2151486; 14.04.2014
comment
Как правило, если вы создаете mvce, который содержит полный автономный код, который кто-то может скомпилировать и выполнить без изменений, это эффективный способ получение помощи и обеспечение того, чтобы ваша программа работала должным образом. - person jewelsea; 15.04.2014
comment
Последние несколько часов я искал stackowerflow и нашел ваш профессиональный ответ здесь Вы лучший . Наконец-то я понял, как передавать аргументы между контроллерами Большое спасибо :) - person user2151486; 15.04.2014

@использование FXML ШАГ 1: Добавьте поле выбора в конструктор сцен и назовите его may(choiceBox) ШАГ 2: В контроллере добавьте следующие коды @FXML private ChoiceBox selectionBox ;

@Override
public void initialize(URL url, ResourceBundle rb) {
 ObservableList<String> list = FXCollections.observableArrayList();
   list.addAll("choice1", "choice2","choice3");
  //populate the Choicebox;  
  choiceBox .setItems(list);

}
person Vax Okagbare    schedule 16.04.2018