繁体   English   中英

Java 8 + Swing:模态对话框理论

[英]Java 8 + Swing: Modal Dialog Theory

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

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

从概念上讲,这对我来说似乎并不困难。 但是,当我尝试确定如何使其在Swing中运行时,无法以某种方式将其组合在一起。 根据我的阅读,GUI组件需要在Swing的事件线程中实例化,因为其中许多都不是线程安全的。 这些相同的组件需要阻塞类似于JOptionPane.showInputDialog()方法的调用(但由于我需要编写自定义组件,所以不相同JOptionPane.showInputDialog() 但是这些调用需要实例化事件线程中的新组件,并等待事件线程中发生事件,然后再将值返回给应用程序。 再加上我需要从对话框中弹出一个对话框的事实,我感到很失落。

我已经阅读了对话框上Java教程,以及StackOverflow和其他站点上的几篇文章,试图确定如何设计可以正常工作的类。 不知何故,我只是根本不了解它是如何工作的(事件线程在第一次阻塞调用后就不会进入睡眠状态?),以及如何编写实现此工作所需的自定义类。 坦白说,我不确定自己对混乱的理解程度是否足以解释这一点。

有人可以说明模态对话框实例化后幕后发生的事情吗? 我如何编写行为如上所述的对话框类?

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

确定,因此此对话框将需要是模式对话框。 我们知道的那么多。

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

单击确定,因此需要在图像和设置对话框的前面关闭加载对话框。 那里也没有大佬。

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

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

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

正确。

这些相同的组件需要阻止类似于JOptionPane.showInputDialog()方法的调用(但由于我需要编写自定义组件,所以不相同)。

这就是模态JDialog允许您执行的操作。 要记住的另一种选择是使用JOptionPane并将JPanel传递给想要JOptionPane显示的任何GUI。 JOptionPanes出奇地灵活和有用。

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

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

有人可以说明模态对话框实例化后幕后发生的事情吗?

现在您可能要求这个站点上的志愿者做太多事情,因为这个问题可能需要有人编写完整的教程来回答,并且之前已经有人问过并回答过,因此您应该可以发现这些信息。 。 如果您真的想了解实际情况,则应首先自己对该主题进行初步研究,查看源代码,如果仍然遇到问题,请先做一个更具体,可回答的问题尽职调查工作。

从主要事件循环开始的模态对话框会生成一个次要事件循环,当主要循环被阻止时,该活动仍保持活动状态。 参见java.awt.SecondaryLoop。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM