0

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

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

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

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

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

4

2 回答 2

2

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

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

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

好的,所以加载对话框需要在图像和设置对话框之外是模态的。那里也没什么大不了的。

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

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

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

正确的。

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

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

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

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

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

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

于 2014-10-16T22:12:58.237 回答
0

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

于 2015-02-04T23:17:51.910 回答