【问题标题】:Java 8 + Swing: Modal Dialog TheoryJava 8 + Swing:模态对话理论
【发布时间】:2014-10-16 22:04:59
【问题描述】:

我正在开发一个具有以下功能的应用程序:

  • 应用程序将有一个“加载图像”按钮来打开图像和设置模式对话框。它需要阻塞直到该对话框返回,如果用户改变主意,则返回处理结果或 null。
  • 图像和设置对话框将允许用户使用JFileChooser 对话框选择图像,并指定处理图像的详细程度。点击“加载”按钮将打开加载对话框。
  • 加载对话框需要是自定义设计的对话框,详细报告图像的耗时处理。如果用户允许处理完成,则需要关闭该对象并将其返回到原始对话框,该对话框需要关闭该对象并将该对象返回给应用程序。如果用户认为执行处理时间过长,他可以取消加载,关闭加载对话框并返回到图像和设置对话框。

从概念上讲,这对我来说似乎并不难。然而,当我试图确定如何让它在 Swing 中工作时,不知何故我无法将它放在一起。根据我的阅读,GUI 组件需要在 Swing 的事件线程中实例化,因为其中许多不是线程安全的。这些相同的组件需要阻止与JOptionPane.showInputDialog() 方法类似的调用(但不一样,因为我需要编写自定义组件)。但是这些调用需要在事件线程中实例化新组件,并等待事件线程中发生事件,然后再将值返回给应用程序。再加上我需要从对话框中弹出一个对话框,我感到很失落。

我已经阅读了Java Tutorial on dialogs 以及 StackOverflow 和其他网站上的几篇文章,试图确定如何设计能够正常工作的类。不知何故,我根本不明白这是如何工作的(事件线程在第一次阻塞调用后不会进入睡眠状态吗?),以及如何编写我需要的自定义类来完成这项工作。坦率地说,我不确定我是否足够理解我的困惑,以至于我能够解释它。

有人可以解释一下模态对话框被实例化后的幕后情况吗?如何编写符合上述要求的对话框类?

【问题讨论】:

    标签: java swing modal-dialog modality


    【解决方案1】:

    应用程序将有一个“加载图像”按钮来打开图像和设置模式对话框。它将需要阻塞直到该对话框返回,如果用户改变主意,则返回处理结果或 null。

    好的,所以这个对话框需要是模态的。我们知道的就这么多。

    图像和设置对话框将允许用户使用 JFileChooser 对话框选择图像并指定处理图像的详细程度。单击“加载”按钮将打开加载对话框。

    好的,因此加载对话框需要在图像和设置对话框之外以模态方式显示。也没什么大不了的。

    加载对话框需要是一个自定义设计的对话框,详细报告图像的耗时处理。如果用户允许处理完成,则需要关闭该对象并将其返回到原始对话框,该对话框需要关闭该对象并将该对象返回给应用程序。如果用户认为执行处理时间过长,他可以取消加载,关闭加载对话框并返回图像和设置对话框。

    好的,因此加载对话框代码将需要实例化并执行一个 SwingWorker 以在后台线程中进行耗时的图像处理,然后让 SwingWorker 使用其发布/处理方法对来推送有关处理细节的信息返回加载对话框。

    ...根据我的阅读,GUI 组件需要在 Swing 的事件线程中实例化,因为其中许多不是线程安全的。

    正确。

    这些相同的组件需要阻塞与 JOptionPane.showInputDialog() 方法类似(但不一样,因为我需要编写自定义组件)的调用。

    这就是模态 JDialog 允许您做的事情。要记住的另一个选项是使用 JOptionPane 并通过 JOptionPane 显示的任何 GUI 传入 JPanel。 JOptionPanes 非常灵活和有用。

    但是这些调用需要在事件线程中实例化新组件,并等待事件线程中发生事件,然后再将值返回给应用程序。再加上我需要从对话框中弹出一个对话框,我感到很失落。

    这很简单。加载对话框将调用一个 SwingWorker,它将与加载对话框进行通信。

    有人可以解释一下模态对话框被实例化后的幕后情况吗?

    现在你可能对这个网站的志愿者要求的有点多,因为这个问题可能需要有人写一个完整的教程来回答,而且之前已经被问过和回答过,所以信息应该是可以被你发现。如果你真的想看看幕后发生了什么,你应该先自己做这个主题的初步研究,看看源代码,如果仍然卡住,在你自己做之后再问一个更具体、更容易回答的问题尽职调查工作。

    【讨论】:

    • -1。您的大部分答案都是重复或重申我写的内容,而我写的内容是基于两天阅读教程和文档的。之后拒绝用“去做研究”回答我的实际问题意味着(充其量)你应该发表评论,而不是发布答案。
    • @sadakatsu:很抱歉,您认为我的任何帖子都没有帮助。我想表达的主要观点是使用 SwingWorker 进行后台线程工作,我在您的帖子中根本没有提到。关于我建议你做研究,嗯,你的问题的最后一部分非常广泛,即使你必须承认这一点,并且要充分和充分地回答它,我必须先进行广泛的研究,但我为什么要或任何人我们这样做。这是你的项目和你的问题,我们都是志愿者,所以努力的责任应该是你的。
    • @sadakatsu: ...继续...如果您在提出问题之前进行了初步研究,那么您可以就对话模式背后的机制提出更具体和尖锐的问题,并且您可能会得到更能让你满意的答案。但无论如何。
    • 首先,我承认“查看源代码”很有帮助。我自己没有想到这一点让我很恼火,这表明我作为一个人和一个程序员缺乏成熟,我让这种恼怒影响了我对你的回应。其次,我承认(甚至同意)为我找到答案不是其他人的责任;我希望有人已经拥有它。第三,虽然我很感谢您对 SwingWorker 信息的帮助,但我没有询问它,因为那是在我阅读的教程中......这不是我的问题的一部分。
    • @sadakatsu:那你的问题是什么?如果它主要是模态对话框的工作方式之一,那么问题就太宽泛了,应该关闭。如果是其他问题,请为我澄清一下。
    【解决方案2】:

    从主事件循环开始的模态对话框会产生一个辅助事件循环,当主循环被阻塞时,该循环保持活动状态。请参阅 java.awt.SecondaryLoop。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多