【问题标题】:Get the View in the Controller获取控制器中的视图
【发布时间】:2015-12-01 09:50:03
【问题描述】:

我想问我如何才能获得我在控制器中显示的视图。 我想这样做的原因是DirectoryChooser 对话框需要ownerWindow 才能正常工作。

还有其他解决办法吗?

    DirectoryChooser directoryChooser = new DirectoryChooser();
    File file = directoryChooser.showDialog(/*I need a javafx.stage.window here!*/);

【问题讨论】:

  • 您在使用 DirectoryChooser 时是否引用了任何其他控件或场景图元素?
  • 是的,我按下一个按钮来打开 DirectoryChooser。这实际上是个好主意。
  • 那就用button.getScene().getWindow()吧。这将返回按钮所在的当前窗口引用。
  • @ItachiUchiha 如果您愿意,可以将其作为答案。谢谢

标签: java model-view-controller javafx


【解决方案1】:

只需从当前显示的任何场景图元素中获取当前窗口的引用。

element.getScene().getWindow()

例如,如果对话框通过按钮的操作打开,您可以从按钮引用中获取窗口。代码如下所示:

button.setOnAction(e -> {
    DirectoryChooser directoryChooser = new DirectoryChooser();
    File file = directoryChooser.showDialog(button.getScene().getWindow());
});

【讨论】:

    【解决方案2】:

    并不是说这是正确的方法,但这确实是一种的方法。反对使用public static 的论点应该牢记在心。

    public class App extends Application {
    
      public static App mainApp;
      public static Stage mainStage;
    
      @Override
      public void start(Stage stage) throws Exception {
        // Remember me.
        mainApp = this;
        mainStage = stage;
    

    然后您可以使用:

        File newLocation = chooser.showDialog(App.mainStage);
    

    【讨论】:

    • 出于显而易见的原因,这不是一个好方法。但它也将其限制为可以成为对话所有者的单个阶段。如果程序打开了超过 1 个使用相同控制器类并允许打开对话框的阶段,则这种方法不再适用(至少在没有一些非常难看的解决方法的情况下不会)。
    • @fabian - 我完全同意 - 根本不会推荐这条路线。但是,在protected void handleFileOpenAction(ActionEvent event) 的上下文中,很难从ActionEvent 中收集Scene - 是吗?
    • 如果它是由用户event.getSource() 的UI 交互激活的,应该会产生一个Node(可以使用ItachiUchia 的方法)。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多