JavaFX通过SQL查询填充组合框

时间:2019-04-18 12:06:00

标签: java javafx combobox

我正在查询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 个答案:

答案 0 :(得分:2)

您确定代码运行没有错误吗?您已将combomain定义为List<String>,这意味着combomain.getItems()combomain.setValue("")会导致编译错误。根据您的FXML文件,该字段应改为ComboBox<String>。但是,即使您修复了该问题,您的initialize方法也不会被调用,您的combomain也不会被注入。来自Introduction to FXML

  

请注意,在前面的示例中,控制器成员字段和事件处理程序方法被声明为public,因此可以由加载程序设置或调用。实际上,这通常不成问题,因为控制器通常仅对创建它的FXML加载程序可见。但是,对于希望对控制器字段或处理程序方法使用更受限的可见性的开发人员,可以使用javafx.fxml.FXML批注。此注释将受保护的或私有的类成员标记为FXML可访问。如果要注释的类在命名模块中,则包含该类的模块必须将包含的包open至少javafx.fxml个模块中使用。

由于您的initialize方法不是public,因此必须用@FXML进行注释,以便FXMLLoader可以看到和调用它。与您的combomain字段相同;尽管FXML文件中有适当的fx:id,但由于该字段为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简介previous section中所述,一种实现方法是在FXML文件的根元素中指定一个fx:controller属性:

<!-- 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,则可以通过打开“文档”部分(左侧面板)中标题为“控制器”的窗格来设置控制器。