当前位置: 首页 > 知识库问答 >
问题:

与已打开的FXML控制器通信

易奇希
2023-03-14

我一次又一次地寻找这件事,但毫无结果。我有一个连接到控制器的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文件中的新值打开一个新阶段。

共有1个答案

芮博厚
2023-03-14

您可以在您的选项控制器中执行类似的操作(顺便说一句,我将重命名事物以符合标准命名约定。)

这里的基本思想只是公开一个属性,该属性表示用户通过单选按钮选择的内容。

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中用定义控制器,它只会生成一个新实例,如果我不定义它,它只会给出错误,因为它里面的按钮没有可参

  • 如何解释文件与其对应的控制器类之间的关系