我一次又一次地寻找这件事,但毫无结果。我有一个连接到控制器的JavaFXFXML窗口;此窗口已打开。单击窗口上的按钮会触发打开另一个FXML文件,该文件链接到其各自的控制器。
第二个窗口(optionsUI.fxml和optioncontroller)有几个单选按钮。单击一个按钮时,我希望在mainUI窗口中更改图像/按钮的位置。我该怎么做呢?
主控制器:
public void assetPressed(MouseEvent event) {
//Get the source of Handler
HUDButton button = (HUDButton) event.getSource();
//Check if an asset is already selected
//----do a thing
//Open stage
openStage(currentAsset);
} else {
//if the current asset selected and the new asset clicked are the same
//----do something
closeStage();
}
//if the current asset selected and the new asset clicked are different
else {
//----do something else
assetIsSelected = true;
openStage(currentAsset);
}
}
}
//opening optionsUI.fxml
public void openStage(Asset asset) {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("optionsUI.fxml"));
Parent root = null;
try {
root = fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
optionsController controller = fxmlLoader.getController();
Scene scene = new Scene(root, 300, 450);
stage.setScene(scene);
if (alreadyExecuted == false) {
stage.initStyle(StageStyle.UNDECORATED);
stage.initOwner(stageControls); //Making the mainUI the owner of the optionsUI
stage.setTitle("HUDEdit Version 3.0.0");
alreadyExecuted = true;
}
我面临的主要问题是在单选按钮上添加一个事件处理程序,这将更改被按下的按钮(currentButton)的属性。我搜索了这个问题,但得到的是我已经做过的:用另一个FXML文件中的新值打开一个新阶段。
您可以在您的选项控制器中执行类似的操作(顺便说一句,我将重命名事物以符合标准命名约定。)
这里的基本思想只是公开一个属性,该属性表示用户通过单选按钮选择的内容。
public class OptionsController {
@FXML
private RadioButton radioButton1 ;
@FXML
private RadioButton radioButton2 ;
private SomeType someValue1 = new SomeType();
private SomeType someValue2 = new SomeType();
private final ReadOnlyObjectWrapper<SomeType> selectedThing = new ReadOnlyObjectWrapper<>();
public ReadOnlyObjectProperty<SomeType> selectedThingProperty() {
return selectedThing.getReadOnlyProperty() ;
}
public final SomeType getSelectedThing() {
return selectedThingProperty().get();
}
public void initialize() {
radioButton1.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
selectedThing.set(someValue1);
}
});
radioButton2.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
selectedThing.set(someValue2);
}
});
}
// ...
}
现在,当您加载选项时。fxml可以观察该属性,并在其值更改时执行所需的任何操作:
public void openStage(Asset asset) {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("optionsUI.fxml"));
Parent root = null;
try {
root = fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
OptionsController controller = fxmlLoader.getController();
controller.selectedThingProperty().addListener((obs, oldSelection, newSelection) -> {
// do whatever you need with newSelection....
});
// etc...
}
使用控制器工厂的问题: 到目前为止,我最好的方法是使用Stephen Chin方法连接顶层控制器。 对于有多个bean实例的情况,父控制器将通过@autowire/@qualifer获取对特定bean的引用,然后在相应的控制器上设置。 下一级控制器也可以通过在顶层控制器上公开它们并调用autowire()来连接 有没有使用控制器工厂机制,这样我就可以在spring上下文中定义控制器,以便更容易地将
问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为
我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类:
我的第一个帖子,请温柔点。 我正在为一个简单的游戏制作一个JavaFX图形用户界面。我有一个FXML布局加载通过FXML文件加载器在这里: 然后我在Main.java创建一个按钮: 以及为了显示: 问题:我究竟如何将FXML布局和普通java按钮对象组合在同一场景中?它像苹果和桔子一样,不可能结合吗?我的IDE不允许我调用java文档中推荐的方法: 等等 请帮我和/或给我指个方向,我真的试过了。。
我有一个用fxml写的边框窗格,它有左窗格和中央窗格的可互换布局。 边框窗格fxml: fxml文件中的一个按钮将在控制器中运行一些代码,用从另一个fxml文件加载的VBox更改边框窗格的右侧。 现在的问题是,我如何告诉右窗格的fxml使用与主窗格相同的控制器?换句话说,我想继承控制器。 如果我在fxml中用定义控制器,它只会生成一个新实例,如果我不定义它,它只会给出错误,因为它里面的按钮没有可参
如何解释文件与其对应的控制器类之间的关系