Tom*_*mmo 6 swing alert javafx modal-dialog jdesktoppane
因此,我们再次将使用完全Swing的现有Java应用程序转换为使用JavaFX.但是,该应用程序将不会完全使用JavaFX.这似乎导致了警报/对话和模态的一些问题.我们目前正在使用Java 8u40.
主应用程序基本上是一个带有菜单的JFrame.主内容窗格是JDesktopPane,单击MenuItem会在DeskopPane中打开新的JInternalFrame.我们转换为JavaFX的屏幕目前基本上是JInternalFrame中的JFXPanel.从JFXPanel打开的任何警报/对话框都是面板本身的模态,但不是JInternalFrame,DeskopPane,Menu等.
我在DialogPane文档中读到他们计划在JavaFX的未来版本中引入一些轻量级对话框甚至可能是InternalFrames,所以我们可能只需要等待一段时间才能实现这一功能.但是,理想情况下,在打开新的警报/对话框时,它将是整个应用程序的模态.
编辑:目前正在为模态对话框执行以下操作:
((Stage)getDialogPane().getScene().getWindow()).setAlwaysOnTop(true);
Run Code Online (Sandbox Code Playgroud)
这使对话框始终显示在顶部,但即使我们的主应用程序已最小化,对话框也仍保留在其他应用程序之上.它也不会阻止对帧中任何Swing组件的输入.
我想我不完全理解你的问题。但这是我的猜测 - 您正在尝试从一些JFXPanel模态窗口(即用户在关闭该警报窗口之前无法单击您的应用程序)到您的整个应用程序创建一个警报窗口,该应用程序部分使用 swing 组件编写。
如果您的应用程序是纯粹用 JavaFX 编写的,那么您会执行类似的操作(假设您在 中的某处创建了一个按钮JFXPanel)
button.setOnAction(evt -> {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.initModality(Modality.APPLICATION_MODAL);
// This will not work in your code
alert.initOwner(button.getScene().getWindow());
alert.show();
});
Run Code Online (Sandbox Code Playgroud)
但因为initOwner需要一个javafx.stage.window传递 swing 组件的对象在您的代码中不起作用。从 Java 8u40 开始,我认为没有正确的方法(即不是黑客)来设置AlertSwing 组件的对象所有权。毫不奇怪,此类问题已经在这里被提出,但在撰写本文时尚未得到解答。
根据您的要求,您可以使用JOptionPane.showMessageDialog方法及其类似的解决方法。
button.setOnAction(evt -> {
JOptionPane.showMessageDialog(desktopPane,"My message");
});
Run Code Online (Sandbox Code Playgroud)
默认情况下,这些对话框是模式对话框,因此无需进行任何操作。您可以从 JavaFX 组件的任何事件处理程序方法中调用这些方法。
| 归档时间: |
|
| 查看次数: |
3064 次 |
| 最近记录: |