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

JavaFX从FXML子级访问父级控制器类

陶腾
2023-03-14

在应用程序中使用JavaFX,我有一个main.fxml文件,其中包含一些fxml子文件。

我想从子控制器访问Main.fxml的MainController类。

我试着用一个例子来解释得更好:

MainFXML:

    <HBox fx:controller="MainController.java">
        <fx:include source="child.fxml"/>
    </HBox>

主控制器:

    public class MainController implements Initializable {
            private String string;
            public void setString (String string) {
                    this.string = string;
            }

ChildFXML:

    <HBox fx:id="child" fx:controller="ChildController.java">
        <Button text="hello" onAction="#selectButton"></Button>
    </HBox>
    public class ChildController implements Initializable {
            @FXML HBox child;
            @FXML Button button;
            @FXML
            public void selectButton (ActionEvent event) {
                // here call MainController.setString("hello");
            }
    // child.getParent().getController();

共有1个答案

姚麒
2023-03-14

如果将fx:id分配给 标记,fxmlloader将尝试将包含的fxml的控制器注入名为 controller 的字段。您可以将maincontroller引用传递给initialize方法中的子控制器:

<HBox fx:controller="MainController.java">
    <fx:include fx:id="child" source="child.fxml"/>
</HBox>
@FXML
private ChildController childController;

@Override
public void initialize(URL url, ResourceBundle rb) {
    childController.setParentController(this);
}
private MainController parentController;

public void setParentController(MainController parentController) {
    this.parentController = parentController;
}

@FXML
private void selectButton (ActionEvent event) {
    this.parentController.setString("hello");
}

但是,保持childcontroller独立于父级将是更好的实践。这可以通过在ChildController中提供StringProperty来实现,该StringProperty设置为父级应显示的值。

private final StringProperty value = new SimpleStringProperty();

public StringProperty valueProperty() {
    return value;
}

@FXML
private void selectButton (ActionEvent event) {
    value.set("hello");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
    childController.valueProperty().addListener((observable, oldValue, newValue) -> setString(newValue));
}
 类似资料:
  • 我尝试注入$scope,然后使用,但这不起作用? 有人能提供建议吗?

  • 问题内容: 我已经使用设置了我的控制器 我有一个父/子嵌套控制器的场景。通过使用,我可以毫无问题地访问嵌套html中的父属性,但是我无法弄清楚如何从子控制器中访问父属性。 我试过注入$ scope然后使用,但这不起作用吗? 谁能提供建议? 问题答案: 如果您的HTML如下所示,则可以执行以下操作: 然后您可以按如下方式访问父范围 如果要从视图访问父控制器,则必须执行以下操作: 参见jsFiddle

  • 问题内容: 如何从儿童的基类访问装饰器? 我以为(错误地)认为ffg。会工作: 该类工作正常,但随后我创建了一个继承自此的子类: 这甚至无法正确导入,更不用说运行了。@_deco未定义。尝试baseclass._deco会引发未绑定的方法_deco()错误,这并不奇怪。 任何想法如何做到这一点,我真的很想将装饰器封装在该类中,但是我对此想法并不满意,需要在基类和子类中对其进行调用。 问题答案:

  • 我正在尝试访问在“MyClass”的@RequestMapping父级中定义的@PathVariables。简化的screnario: 此类是某种产品的基类,不应进行编辑。因此,我扩展了“父类”。在“MyClass”中,我想做如下操作: 我认为这是允许的(还没有测试),但我不知道如何获得所有已经用“ParentClass”定义的PathVariable。 非常感谢您的任何想法/RTFM参考。

  • 更新 我试过很多解决办法,但都没有达到我的目标。应用程序加载UsersMainPageController,它只包含一个AnchorPane(类似于父控件),因此这是相关代码: [UsersMainPageController]