将数据添加到JavaFX 2.2中的静态ComboBox

时间:2014-02-04 23:13:53

标签: java combobox javafx

我无法弄清楚如何在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是私有的,并且我在initialize方法中添加了它的工作,但是使用静态ComboBox我尝试了数百万件但仍没有进展。

1 个答案:

答案 0 :(得分:1)

解决方案

请勿同时使用static@FXML

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

其他问题

@FXML成员(例如comboBoxTileList)永远不应设置为新值,因此您不应该comboBoxTileList = new ComboBox<>();

回答其他问题

  

我使用另一个窗口来创建新的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. 
        }
    }
}