向组合框添加值

Adding values to Combobox

我想在我的组合框中添加 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");
}

如您所见,我尝试了两种不同的方法。我通过 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 文档的关系。

方法一:控制器定义为fx:controller

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

相反,您应该在 Main:

中创建对控制器的引用
private Controller;

然后更新您的 start() 方法,将控制器设置为由 FXMLLoader:

加载的 FXML 中定义的控制器
@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中没有定义控制器

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

loader.setController(controller);

当然,如果您正在使用此方法(并希望以后引用控制器),您需要先实例化Controller,这样您将使用原始代码中的行:

private Controller controller = new Controller();