JavaFX 2.2带有FXML的模态窗口对话框

4

我正试图使用@jewelsea提供的示例在此Gist中,但我卡住了,因为我正在使用FXML。

我看过这两篇文章:如何在JavaFX 2.1中创建模态窗口JavaFX 2模态窗口的此答案

我的问题出现在jewelsea的代码中,其中写道:

final WebView webView = new WebView(); 
webView.getEngine().load("http://docs.oracle.com/javafx/");
primaryStage.setScene(new Scene(webView));

鉴于我正在使用FXML,因此我这样做:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MyFXML.fxml"));
Scene scene = (Scene)fxmlLoader.load();
myController = fxmlLoader.getController();
primaryStage.setScene(scene);

你能告诉我如何修改我的代码(上面的4行),使其与jewelsea的示例一起工作吗?

谢谢!

1个回答

3
您正在使用通过FXMLLoader而不是WebView创建场景示例代码的替换代码,这很好,您不需要修改它。
您的代码将基于fxml文档显示主要阶段的主场景(对于我的示例,我使用WebView作为我的主场景,您不需要它,因此您不需要来自gist的任何与WebView相关的代码)。
您需要的是在控制器中设置一些触发器,以便在想要显示对话框的时候。作为一个简单的例子,您可以为主场景设置一个fxml,其中只包括一个按钮,然后在控制器中为按钮提供ActionHandler(就像FXML介绍文档中一样)。
现在,不要像FXML介绍中那样在按下按钮时仅执行println,而是像gist在WebView文档加载时一样调用dialog.show()方法。应该发生的是,对话框现在将显示在您的fxml生成的场景之上。
你会注意到对话框本身包含一个场景。如果你想(这是可选的),你可以使用fxml定义场景内容。为此,在对话框构建时,您设置了一个新的fxml和对话框内容的新控制器,并将创建的fxml场景加载到对话框的舞台中。要执行此操作,所需的代码与用于将主场景的fxml加载到primaryStage中的代码几乎相同。
尝试上述方法,看看它是否适用于您。如果你还卡住了,我可能可以创建一个基于这个答案的fxml特定示例。
还请注意,引用的gist是一段时间前编写的,现在JavaFX中有一个showAndWait方法,可以在调用对话框并允许处理对话框结果时促进阻塞代码的执行,而不使用来自gist示例的某些事件处理程序机制。使用和不使用showAndWait的策略都是完全可接受的解决方案。

再次感谢。我认为我几乎已经将其集成,唯一卡住的地方是我不确定如何最好地将对dialog变量的引用传递到我的控制器中,以便在其中调用dialog.showAndWait();--在我的处理程序中操作我的primaryStage场景,通过FXML创建。我甚至尝试(不成功)在我使用的主场景FXML文件中创建一个虚拟的<Scene fx:id ="dialog"/>(具有相应的@FXML Stage dialog;声明的控制器)。还有其他建议吗?(我使用的方法不是使用带有对话框的FXML,只是用于我的主要场景。) - likethesky
我已经找了很多地方,但是找不到任何教程来介绍如何在使用FXML创建主控制器后编写“常规”(非FXML)JavaFX代码。我认为这个对话框并不需要一个完整的单独的FXML文件、控制器等(它只是一个警告,在执行一些操作之前,然后继续我的主舞台)。所以,有关如何获取对我的“dialog”对象的引用的任何帮助都将不胜感激。再次感谢。 - likethesky
这里是一个临时链接,包含一个NetBeans项目的示例,其中包括启动一个非FXML对话框的fxml页面。 - jewelsea
哇,非常详细。谢谢!感谢您的所有帮助。(我认为在getSide中有一个复制/粘贴错误——来自setSide,但除此之外看起来很棒。) - likethesky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接