【问题标题】:Controls FX Progress Dialog Modality & Alert Modality控制 FX 进度对话框模式和警报模式
【发布时间】:2015-03-08 02:53:31
【问题描述】:

我遇到了一个小问题,我不确定该怎么做。

我的应用程序将有一个通用应用程序阶段,它将向用户展示他们的工作选项 - 即任务列表或类似的东西。

当用户选择这些选项之一时,我将导航到窗口以执行工作。他们希望总的舞台永远开放,并为要完成的工作打开另一个舞台。我可以这样做:

FXMLLoader loader = new FXMLLoader();
Parent node = loader.load(this.getClass().getResource("MyView.fxml").openStream());
Scene scene = new Scene(node);
Stage stage = new Stage();
stage.setTitle("You are working on - Blah Blah Blah....");
stage.setScene(scene);
stage.show();

这提供了所需的外观和感觉 - 但是当显示模式窗口时,我似乎遇到了线程问题。

例如 - 在一个工作窗口中,我启动一项服务并显示一个 ControlsFX 进度对话框,如下所示:

ProgressDialog progDiag = new ProgressDialog(service);
progDiag.setTitle("Busy");
progDiag.setHeaderText("Doing the work you asked me to do....");
service.start();

让我们假设这是一个正在检索大量数据的服务器调用 - 所以在处理这个过程时,我想转移到另一个开放的阶段来处理它。但是我不能,因为整个应用程序的 UI 都被这个控件阻止了。

其次,假设某个阶段发生错误,我们会显示警报:

Alert error = new Alert(AlertType.ERROR);
error.setContentText("Something bad just happened....");
error.show();

这还会阻止整个用户界面,而不仅仅是出现问题的阶段。

Java FX 中是否有办法在新进程/线程中打开不会被其他阶段的警报阻塞的阶段?

【问题讨论】:

    标签: javafx-8 alerts controlsfx


    【解决方案1】:

    我能够通过向将显示消息的控制器提供阶段的参考来解决我的问题。我对此并不疯狂,因为我需要传递该参考,但我没有找到另一种方法来处理它..

    ProgressDialog progDiag = new ProgressDialog(service);
    progDiag.setTitle(title);
    progDiag.initOwner(getPrimaryStage());
    progDiag.setHeaderText(message);
    progDiag.initModality(Modality.WINDOW_MODAL);
    service.start();
    

    【讨论】:

    • 这样做是对的。您可以为对话框定义 3 种不同类型的模态(非模态、应用程序模态、窗口模态)。通过使用第一个对话框/窗口不是模态的,任何窗口都可以在它前面。通过使用“应用程序模式”模式,新对话框始终位于顶部,并且无法聚焦其他窗口。 “window modal”类型定义对话框只针对其父窗口模式。通过这样做,您不能访问父窗口,而是访问任何其他窗口。为此,对话框需要对其父窗口的引用。
    • 是的,这就是我能够处理的方式。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2019-05-20
    • 2011-07-01
    • 2011-04-22
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多