JavaFX Заполнить Combobox из SQL-запросов - PullRequest
0 голосов
/ 18 апреля 2019

Я запрашиваю Sql Server и возвращаю список - я хочу использовать этот список в качестве источника для моего комбинированного списка.Ниже приведен код, который я использую, и он работает без ошибок, но мой выпадающий список всегда пуст и никогда не заполняется.Что здесь не так?

public class Controller {
    private List<String> combomain;
    static String getData = "QueryHEre";

    void initialize() {
        empnames = queryDatabase(getData);
        String[] names = empnames.toArray(new String[0]);

        combomain.getItems().addAll(names);
        combomain.setValue("");
    }

Main.java

public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 350, 275));
    primaryStage.show();
}

sample.fxml

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="399.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <FlowPane hgap="10.0" layoutX="14.0" layoutY="7.0" prefHeight="30.0" prefWidth="375.0">
         <children>
            <Label alignment="CENTER_RIGHT" prefHeight="17.0" prefWidth="79.0" text="Employee:" />
            <ComboBox id="combomain" fx:id="combomain" prefWidth="150.0" />
            <Button mnemonicParsing="false" prefHeight="27.0" prefWidth="80.0" text="Get Info" />
         </children>
      </FlowPane>
   </children>
</Pane>

1 Ответ

2 голосов
/ 18 апреля 2019

Вы уверены, что код работает без ошибок? combomain определено как List<String>, что должно означать combomain.getItems(), а combomain.setValue("") приведет к ошибкам компиляции. Исходя из вашего файла FXML, это поле должно быть ComboBox<String>. Однако, даже если вы исправите это, ваш initialize метод не вызывается, и ваш combomain также не вводится. С Введение в FXML :

Обратите внимание, что в предыдущих примерах поля элементов контроллера и методы обработчика событий были объявлены как открытые, поэтому они могут быть установлены или вызваны загрузчиком. На практике это не часто является проблемой, поскольку контроллер обычно виден только загрузчику FXML, который его создает. Однако для разработчиков, которые предпочитают более ограниченную видимость полей контроллера или методов-обработчиков, можно использовать аннотацию javafx.fxml.FXML. Эта аннотация помечает защищенного или частного члена класса как доступный для FXML. Если аннотируемый класс находится в именованном модуле, модуль, содержащий этот класс, должен open содержащий пакет по крайней мере для модуля javafx.fxml.

Поскольку ваш метод initialize не является public, он должен быть помечен @FXML, чтобы он мог быть замечен и вызван FXMLLoader. То же самое с вашим combomain полем; несмотря на наличие соответствующего fx:id в файле FXML, оно не будет внедрено, поскольку поле имеет значение private и не помечено @FXML.

Ваш контроллер должен выглядеть так:

public class Controller {

    @FXML
    private ComboBox<String> combomain;
    static String getData = "QueryHEre";

    @FXML
    void initialize() {
        empnames = queryDatabase(getData);
        String[] names = empnames.toArray(new String[0]);

        combomain.getItems().addAll(names);
        combomain.setValue("");
    }

}

Однако , даже если все исправлено, все равно не будет работать, потому что вы не связали свой класс контроллера с файлом FXML. Как уже упоминалось в предыдущем разделе из Введение в FXML , один из способов сделать это - указать атрибут fx:controller в корневом элементе файла FXML:

<!-- SOME ATTRIBUTES OMITTED FOR BREVITY -->
<Pane xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" 
      fx:controller="sample.Controller">
    <!-- OMITTED FOR BREVITY -->
</Pane>

Где sample.Controller следует заменить на полное имя вашего класса контроллера. Если вы используете Scene Builder, вы можете установить контроллер, открыв панель с заголовком «Контроллер» в разделе «Документ» (левая панель).

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