【问题标题】:Add data to static ComboBox in JavaFX 2.2在 JavaFX 2.2 中将数据添加到静态 ComboBox
【发布时间】:2014-02-04 23:13:52
【问题描述】:

我只是不知道如何在 JavaFX 2.2 中将数据添加到静态 ComboBox。无论我尝试做什么 ComboBox 都是空的。代码如下:

@FXML private MenuItem menuItemNewTile;
@FXML private static ComboBox<Tile> comboBoxTileList;

@FXML
private void menuItemNewTileSetOnAction(ActionEvent event) throws IOException {
    Parent root = FXMLLoader.load(getClass().getResource(TILE_WINDOW_URL));
    Scene scene = new Scene(root);

    Stage tileStage = new Stage();
    tileStage.setScene(scene);
    tileStage.show();
}

@FXML
private void comboBoxTileListSetOnAction(ActionEvent event) {

}

@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    comboBoxTileList = new ComboBox<>();
}

public static void refreshTileList(Tile tile) {
    comboBoxTileList.getItems().add(tile);
}

如果 ComboBox 是私有的,并且我在初始化方法中添加项目它正在工作,但使用静态 ComboBox 我尝试了数百万个东西,但仍然没有进展。

【问题讨论】:

    标签: java combobox javafx


    【解决方案1】:

    解决方案

    不要同时使用static@FXML

    重新设计您的设计,以便 comboBoxTileList 不再需要 static 关键字,而是使用实例变量。

    其他问题

    @FXML 成员(例如 comboBoxTileList)永远不应设置为新值,因此您不应拥有 comboBoxTileList = new ComboBox&lt;&gt;();

    回答其他问题

    我使用另一个窗口创建新的 Tile 对象,并从该窗口的控制器类调用 refreshTileList 方法。如何在不使用静态的情况下做到这一点?

    编写代码的方法有很多种,因此您不需要对控制器成员进行静态引用。这是一个基于以下解决方案的示例:Passing Parameters JavaFX FXML。您需要修改示例以适合您的具体情况,它只是为了演示您可以使用的可能模式。

    您可以在代码中构造一个新的控制器,将您想要的任何参数从调用者传递到控制器构造函数中。构造控制器后,您可以在调用 load() 实例方法之前将其设置在 FXMLLoader 实例上。

    要在加载器上设置控制器(在 JavaFX 2.x 中),您也不能在 fxml 文件中定义 fx:controller 属性。

    class ComboController {
        @FXML private static ComboBox<Tile> comboBoxTileList;
    
        public void refreshTileList(Tile tile) {
            comboBoxTileList.getItems().add(tile);
        }
    }
    
    class AnotherController {
        @FXML private Button createTile;
        @FXML private Button newCombo;
        @FXML private StackPane mainPane;
    
        private comboController;
    
        @FXML private void createTile(ActionEvent event) {
            if (comboController == null) {
                return;
            }
    
            comboController.refreshTileList(
                new Tile()
            );
        }
    
        @FXML private void newCombo(ActionEvent event) {
            try {
                comboController = new ComboController();
    
                FXMLLoader loader = new FXMLLoader(
                    getClass().getResource(
                        "combo.fxml"
                    )
                );
                loader.setController(comboController);
    
                Pane comboPane = (Pane) loader.load();
    
                mainPane.getChildren().setAll(comboPane);
            } catch (IOException e) {
                // handle exception. 
            }
        }
    }
    

    【讨论】:

    • 问题是我使用另一个窗口来创建新的 Tile 对象,并从该窗口的控制器类调用 refreshTileList 方法。如何在不使用静态的情况下做到这一点?
    • 编辑答案以演示如何删除静态成员。
    • 非常感谢您的回复。我以您的解决方案为指导并进行了微调。我将 ComboController 设置为具有其自己实例的私有静态字段的单例,并从 TileWindowController 调用它的 geter 并且它可以工作。我还从 fxml 文件中删除了 fx:controller。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多