【问题标题】:Adding values to Combobox向组合框添加值
【发布时间】:2021-05-25 04:06:49
【问题描述】:

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

【问题讨论】:

  • 如果在 Scenebuilder/FXML 中创建节点,则不应执行 `taal = new ComboBox();`。
  • 阅读有关如何使用 fxml 的教程 .. 另一个错误(除了 @Sedrick 已经发现的错误)是必须加载控制器(与实例化相比)

标签: java javafx combobox scenebuilder


【解决方案1】:

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

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

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

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

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


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

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

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

如果您在 FXML 文档中定义了控制器,那么 JavaFX 将为您建立连接。但是,与 ComboBox 一样,您将用 Java 代码中的新 Controller 替换 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();
}

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

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

loader.setController(controller);

当然,如果您正在使用这种方法(并希望继续引用控制器),您需要先实例化 Controller,以便使用您的原代码:

private Controller controller = new Controller();

【讨论】:

  • 注意:在method1中——你必须先加载层次结构,否则你抓取的控制器为空!在方法 2 中 - 您仍然必须在加载之前或之后保留对创建的控制器的引用(如果您想对它做任何事情)(您可能会这样做,但单行可能会让新手有点困惑 :)跨度>
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多