4

我试图在这个要点上使用@jewelsea 提供的示例,但我被卡住了,因为我使用的是 FXML。

我已经看过这两个帖子:How to create a modal window in JavaFX 2.1这个对 JavaFX 2 modal window 的回答

我被卡住的地方是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 的例子吗?

谢谢!

4

1 回答 1

3

您使用的替换代码通过FXMLLoader而不是WebView创建的场景示例代码很好,您不需要修改它。

您的代码将基于 fxml 文档显示您的主要阶段的主场景(对于我的示例,我使用 WebView 作为我的主场景,您不需要,因此您不需要任何与 WebView 相关的代码要旨)。

您需要的是在您想要显示对话框时控制器中的一些触发器。作为一个简单的示例,您可以为您的主场景设置一个仅包含一个按钮的 fxml,然后为您的控制器中的按钮提供一个 ActionHandler(就像在FXML 简介文档中一样)。

现在,不再像 FXML 简介那样在按下按钮时执行 println,而是dialog.show()像加载 WebView 文档时的要点一样调用方法。应该发生的是,对话框现在将显示在您的 fxml 生成的场景之上。

您会注意到对话框本身包含一个场景。如果您愿意(这是可选的),您可以使用 fxml 定义场景内容。为此,在对话构建时,您为对话内容设置了一个新的 fxml 和新的控制器,并将为对话创建的 fxml 场景加载到对话的阶段。执行此操作的代码与您用于将主场景的 fxml 加载到 primaryStage 的代码几乎相同。

试试上面的方法,看看它是否适合你。如果您仍然被卡住,我可能可以按照这个答案的思路创建一个 fxml 特定的要点示例。

另请注意,引用的要点是不久前编写的,JavaFX 中现在有一个showAndWait方法,该方法有助于在进行对话框调用时阻止代码执行,然后允许在不使用某些事件处理程序的情况下处理对话框的结果gist 示例中的机制。有和没有 showAndWait 的策略都是完全可以接受的解决方案。

于 2012-09-22T02:05:58.670 回答