我无法弄清楚如何在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我尝试了数百万件但仍没有进展。
答案 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.
}
}
}