我有一个Foo类,只需加载FXML并创建场景。
在FXML中,我将控制器设置为FooController(fx:controller="FooController"
)
我添加一个MenuButton:
<MenuButton fx:id="menuButton" layoutX="264.1875" layoutY="146.5" mnemonicParsing="false" text="MenuButton" />
我尝试在FooController中设置menuButton:
public class FooController implements Initializable{
@FXML
final MenuButton menuButton = new MenuButton("Modalities");
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
final ObservableList<CheckMenuItem> listFilter = FXCollections.observableArrayList();
final MenuButton menuButton = new MenuButton("Modalities");
CheckMenuItem item1 = new CheckMenuItem("T1");
CheckMenuItem item2 = new CheckMenuItem("T1C");
CheckMenuItem item3 = new CheckMenuItem("T2");
listFilter.addAll(item, item2, item3);
menuButton.getItems().addAll(listFilter);
menuButton.setId("menuButton");
}
}
但是,尽管为MenuButton设置了所有内容,但它不会在GUI中显示任何CheckMenuItems。
如何在FXML中定义的menuButton中加载这些项?
答案 0 :(得分:2)
从不 将@FXML
初始化值设置为新值。
在您发布的代码中,您正在执行此操作两次,而您根本不应该这样做。
FXMLLoader将在其实例化的组件的层次结构中创建新项目,并将对这些新项目的引用注入到控制器中。如果然后将这些引用设置为新值,则新值将永远不会包含在显示的组件层次结构中,除非您在那里专门添加它们,这首先忽略了使用FXML的目的,因为它忽略了FXML中定义的内容文件。
你应该拥有的是:
public class FooController {
@FXML
MenuButton menuButton;
public void initialize() {
menuButton.getItems().addAll(
FXCollections.observableArrayList(
new CheckMenuItem("T1"),
new CheckMenuItem("T1C"),
new CheckMenuItem("T2")
)
);
}
}
另请注意,如果上面代码中的CheckMenuItems是静态的而不是动态列表,那么您可以在FXML文档中定义它们,而不是在代码中创建它们。
注意:这是一个重复的问题,之前已经被问过(不是确切的问题,但是它的实质内容),但我的谷歌技能无法挖掘出一些重复的问题。< / p>