【问题标题】:ComboBox in JavaFX application doesn't show the dataJavaFX 应用程序中的 ComboBox 不显示数据
【发布时间】:2016-09-28 13:17:07
【问题描述】:

我有课:

public class Element {
    private final IntegerProperty id;
    private final StringProperty name;

    ...constructors...

    public Integer getId() {
        return id.get();
    }

    public void setId(Integer id) {
        this.id.set(id);
    }

    public IntegerProperty idProperty() {
        return id;
    }

    public String getName() {
        return name.get();
    }

    public void setName(String name) {
        this.name.set(name);
    }

    public StringProperty nameProperty() {
        return name;
    } 

    @Override
    public String toString() {
        return name.get();
    }

我尝试在 ComboBox 中显示这些元素的列表。在我的控制器中,我有:

@FXML
private ComboBox<Element> combo;

然后我在函数中有以下代码来填充其他 GUI 元素:

ObservableList<Element> elements = FXCollections.observableArrayList(ElRep.getElements());
combo = new ComboBox<Element>(elements);
combo.getSelectionModel().selectFirst();

我也试过了:

combo.setItems(elements);

似乎没有任何效果。我得到空的组合框。

【问题讨论】:

  • 这里有几个这样的问题;我现在无法通过快速搜索找到它们。但是不要初始化@FXML-annotated 字段。 IE。删除行combo = new ComboBox&lt;&gt;(...)。您正在创建一个新的组合框(即不是您在 FXML 文件中定义的组合框)并在其上设置项目,而不是您在 FXML 中创建的组合框。
  • 然后我的组合变量设置为 null,即使我的 ComboBox 的 fx:id 已设置,我也会得到 NullPointerException。
  • 那你做错了。但是通过创建一个新的组合框来“修复”它肯定是行不通的。 Edit 你的问题显示minimal reproducible example,带有最小的控制器和 FXML 文件。

标签: java javafx combobox fxml


【解决方案1】:

您应该从不初始化带注释的字段@FXML:该注释的重点是该对象是作为加载 FXML 文件的一部分创建的,并被注入到控制器中。如果您创建一个新对象,您将不再引用由 FXML 加载程序创建的对象(并显示在 UI 中):因此您对该对象的属性所做的任何更改都不会出现在 UI 中。

因此省略对new ComboBox&lt;&gt;(...) 的调用并使用combo.setItems(...)(或combo.getItems().setAll(...))来初始化现有的组合框:

示例控制器:

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;

public class Controller {


    @FXML
    private ComboBox<Element> combo ;

    public void initialize() {
        ObservableList<Element> elements = FXCollections.observableArrayList(
            new Element(1, "Element 1"),
            new Element(2, "Element 2")
        );

        combo.setItems(elements);
        combo.getSelectionModel().selectFirst();
    }
}

FXML 文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ComboBox?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller">
    <top>
        <ComboBox fx:id="combo" />
    </top>
</BorderPane>

测试:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Scene scene = new Scene(FXMLLoader.load(getClass().getResource("sample.fxml")), 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2021-08-02
    • 1970-01-01
    • 2014-06-03
    • 2015-08-30
    相关资源
    最近更新 更多