gpt4 book ai didi

JavaFX - 从子 Controller 到达主 Controller

转载 作者:行者123 更新时间:2023-12-02 04:18:55 25 4
gpt4 key购买 nike

关于this page from oracle解释了如何在主 Controller 中注入(inject)子 Controller :

<VBox fx:controller="com.foo.MainController"> 
...
<fx:include fx:id="dialog" source="dialog.fxml"/>
...
</VBox>

public class MainController extends Controller {
@FXML private Window dialog;
@FXML private DialogController dialogController;

...

现在,我想知道如何从子 Controller (在本例中为 DialogController)访问 MainController 实例。

感谢您的帮助!

最佳答案

我建议不要这样做。如果您DialogController依赖于您的 MainController ,那么它不能独立于 MainController 使用,这增加了两者之间不必要的耦合(即它破坏了封装)。

您可能只想在MainController中发生一些事情。当DialogController中的某些状态时变化。因此,您应该将该状态公开为 DialogController 中的可观察属性。并从主 Controller 观察:

public class DialogController {

private final ReadOnlyObjectWrapper<Person> selectedPerson = new ReadOnlyObjectWrapper<>();

public ReadOnlyObjectProperty<Person> selectedPersonProperty() {
return selectedPerson.getReadOnlyProperty();
}

public final Person getSelectedPerson() {
return selectedPersonProperty().get();
}

@FXML
private Button okButton ;

public void initialize() {
okButton.setOnAction(selectedPerson.set(new Person(...)));
}
}

然后

public class MainController extends Controller { 
@FXML private Window dialog;
@FXML private DialogController dialogController;

public void initialize() {
dialogController.selectedPersonProperty().addListener((obs, oldPerson, newPerson) -> {
// ... whatever you need to do here with new data when OK is pressed in dialog...
});
}
}

如果您确实想访问MainController来自DialogController ,那么您可以按照评论中的建议,通过“手动”注入(inject) MainController 来执行此操作进入DialogController 。然而,在我看来,这是一个糟糕的设计。

public class DialogController {

// Ugh. DialogController cannot be used outside the context where
// MainController exists.
private MainController mainController ;

@FXML
private Button okButton ;

public void setMainController(MainController mainController) {
this.mainController = mainController ;
}

public void initialize() {
okButton.setOnAction(e -> {
if (mainController != null) {
mainController.doSomething();
}
});
}
}

public class MainController {

@FXML
private DialogController dialogController ;

public void initialize() {
dialogController.setMainController(this);
}

public void doSomething() {
// ...
}
}

关于JavaFX - 从子 Controller 到达主 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32987195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com