微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

向组合框添加值

如何解决向组合框添加值

我想在我的组合框中添加 2 个值。我用场景构建器添加了这个组合框。我使用了一种方法来做到这一点,但只是得到一个空的组合框。

@FXML
private ComboBox<String> taal;

 @FXML
 public void comboItems(){
//        ObservableList<String> list = FXCollections.observableArrayList("Nederlands","Engels");
//        taal = new ComboBox<>();
//        taal.setItems(list);

    taal = new ComboBox<>();
    taal.getItems().addAll("Nederlands","Frans");
    System.out.println(taal.getItems());
    System.out.println("comboBox");
}

如您所见,我尝试了 2 种不同的方法。我通过 system.out.println 获取了 console.log 上的所有内容,但在运行项目时仍然得到一个空的组合框。

这是我初始化它的地方:

public class Main extends Application {

    private static Controller controller = new Controller();

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("student.fxml"));
        primaryStage.setTitle("Studenten");
        primaryStage.setScene(new Scene(root,1200,800));


        root.getStylesheets().add("student.css");
        primaryStage.show();
    }


    public static void main(String[] args) {

        StudentIO.open();
        controller.comboItems();//that comboBox is inside a class which is called controller.
        

        launch(args);
    }
}

解决方法

您在处理 FXML 时犯了几个初学者的错误。

首先,如果您已经在 FXML 中定义了 ComboBox,那么您不需要使用 new ComboBox() 创建一个新的。当您在控制器中声明该字段并使用 @FXML 注释对其进行注释时,JavaFX 将在称为“注入”的过程中为您创建 ComboBox 的新实例。

本质上,JavaFX 正在获取您在 FXML 中定义的 ComboBox 并将其“注入”到您的控制器中,从而创建您可以在代码中引用的 Java 对象。

在您的行 taal = new ComboBox<>(); 中,您告诉 Java 将 taal 变量设置为全新的 ComboBox,这与您在 FXML 布局中显示的不同。

当您向 taal 添加项目时,您正在taal 添加项目,但这不是您看到的 ComboBox屏幕上;您不再有任何对该特定 ComboBox 的引用。


正如 kleopatra 在她的评论中提到的,下一个问题是您正在创建一个新的 Controller,但您的 FXML 布局对此一无所知,因此它实际上根本没有“控制”您的布局。

有两种可能的方法可以解决此问题,具体取决于您如何定义控制器与 FXML 文档的关系。

方法 1:使用 fx:controller 定义的控制器

如果您在 FXML 文档中定义了控制器,那么 JavaFX 将为您建立连接。但是,与 ComboBox 一样,您将在 Java 代码中用新的 Controller 替换 JavaFX 实例化的 Main

相反,您应该在 private Controller; 中创建对控制器的引用:

start()

然后更新您的 FXMLLoader 方法,将控制器设置为由 @Override public void start(Stage primaryStage) throws Exception{ FXMLLoader loader = new FXMLLoader(getClass().getResource("student.fxml")); Scene scene = new Scene(loader.load()); scene.getStylesheets().add("student.css"); // Here you get a reference to the controller from the FXMLLoader controller = loader.getController(); primaryStage.setTitle("Studenten"); primaryStage.setScene(scene,1200,800)); primaryStage.show(); } 加载的 FXML 中定义的控制器:

fx:controller

方法二:FXML中没有定义控制器

如果您不在 FXML 文档中使用 start(),您只需在 loader.getController() 方法中为 FXMLLoader 设置控制器。不要调用 loader.setController(controller); 方法,而是使用 setter 方法:

Controller

当然,如果您正在使用此方法(并希望引用控制器),您需要先实例化 private Controller controller = new Controller(); 以便您使用该行来自您的原始代码:

chromedriver -version

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。