我正在开发一个具有以下功能的应用程序:
- 该应用程序将有一个"加载图像"按钮来打开图像和设置模式对话框。它需要阻塞,直到对话框返回,或者返回处理结果,或者如果用户改变主意,则返回null
- 图像和设置对话框将允许用户使用
JFileChooser
对话框选择图像,并指定处理图像的详细程度。单击"加载"按钮将打开加载对话框 - 加载对话框需要是一个自定义设计的对话框,详细报告图像处理的耗时情况。如果用户允许处理完成,则需要关闭对象并将其返回到原始对话框,该对话框需要关闭该对象并将该对象返回到应用程序。如果用户认为执行处理的时间过长,则可以取消加载,关闭加载对话框并返回图像和设置对话框
从概念上讲,这对我来说似乎并不难。然而,当我试图确定如何在Swing中实现这一点时,不知何故,我无法将其整合在一起。根据我所读到的内容,GUI组件需要在Swing的事件线程中实例化,因为其中许多组件不是线程安全的。这些相同的组件需要阻止与JOptionPane.showInputDialog()
方法类似的调用(但不相同,因为我需要编写自定义组件)。但这些调用需要在事件线程中实例化新组件,并等待事件线程中发生事件,然后再向应用程序返回值。再加上我需要一个对话框才能从对话框中弹出,我感到非常失落。
我已经阅读了关于对话框的Java教程,以及StackOverflow和其他网站上的几篇文章,试图确定如何设计正确工作的类。不知怎的,我根本不明白这是怎么回事(事件线程在第一次阻塞调用后不是要睡觉吗?),也不明白我如何编写使其工作所需的自定义类。坦率地说,我不确定我是否足够理解我的困惑,以至于我能够解释它
有人能解释一下当模式对话框被实例化时,引擎盖下会发生什么吗?如何编写能够按照如上所述的方式进行操作的对话框类?
该应用程序将有一个"加载图像"按钮来打开图像和设置模式对话框。它需要阻塞,直到对话框返回,或者返回处理结果,或者如果用户改变主意,则返回null。
好的,所以这个对话框需要是模态的。我们知道这么多。
图像和设置对话框允许用户使用JFileChooser对话框选择图像,并指定处理图像的详细程度。单击"加载"按钮将打开加载对话框。
好的,所以加载对话框需要在图像和设置对话框之外的模式中。也没什么大不了的。
加载对话框需要是一个自定义设计的对话框,详细报告图像处理的耗时情况。如果用户允许处理完成,则需要关闭对象并将其返回到原始对话框,该对话框需要关闭该对象并将该对象返回到应用程序。如果用户认为执行处理的时间过长,则可以取消加载,关闭加载对话框并返回图像和设置对话框。
好的,所以加载对话框代码需要实例化并执行SwingWorker,以便在后台线程中进行耗时的图像处理,然后让SwingWorkers使用其发布/处理方法对将有关处理细节的信息推送回加载对话框。
根据我所读到的内容,GUI组件需要在Swing的事件线程中实例化,因为其中许多组件不是线程安全的。
正确。
这些相同的组件需要阻止与JOptionPane.showInputDialog()方法类似的调用(但不相同,因为我需要编写自定义组件)。
这就是模式JDialog允许你做的。另一个需要记住的选项是使用JOptionPane,并传递一个JPanel,其中包含你希望JOptionPanel显示的任何GUI。JOptionPanes非常灵活和有用。
但这些调用需要在事件线程中实例化新组件,并等待事件线程中发生事件,然后再向应用程序返回值。再加上我需要一个对话框才能从对话框中弹出,我感到非常失落。
再说一遍,这很简单。加载对话框将调用SwingWorker,后者将通信回加载对话框。
有人能解释一下当模式对话框被实例化时,引擎盖下会发生什么吗?
现在你可能要求这个网站上的志愿者做的有点太多了,因为这个问题可能需要有人写一个完整的教程来回答,而且以前也有人问过和回答过,所以你应该可以发现这些信息。如果你真的想看看幕后发生了什么,你应该首先自己对这个主题进行初步研究,查看源代码,如果仍然停滞不前,在第一次做了自己的尽职调查后,问一个更具体、更可回答的问题。
从主事件循环启动的模式对话框生成一个在主循环被阻止时仍处于活动状态的辅助事件循环。请参阅java.awt.SecondaryLoop.