我有一个使用 JInternalFrames 的 MDI 应用程序。每个内部框架执行不同的操作,但是,其他一些框架使用 JOptionPane 显示消息,这当然会暂停整个应用程序。
无论如何(无论何时 JOptionPane 对话框或任何其他对话框)都是模态到其 OWN 内部框架(即框架 X 显示一条消息,暂停其 OWN 框架,但允许框架 Y 和应用程序的其余部分继续)?
是否可以在不必更改代码(或至少只更改一小部分)的情况下做到这一点?
我明白你在问什么,这可能是可能的,但绝对不容易。您希望模态对于弹出模态对话框的 JInternalFrame 是“本地的”。
首先,您需要了解模态弹出窗口实际上有 2 个部分,可以用您自己创建的东西来近似。1) 设置模态弹出框直到弹出框关闭的代码,以及 2) 当模态弹出框可见时,“背景”不响应 GUI 事件。
真正的模态通过阻塞当前的 EDT 并为模态组件创建一个新的事件泵来实现这一点。(请参阅 java.awt.Container.#startLWModal())这对您不起作用,因为您的所有 JInternalFrames 共享 1 个 EDT,这对于 Swing 的工作方式非常基础(单 UI 线程)
但是,您的 JInternalFrames 是 JRootPanes,这意味着它们具有玻璃窗格。您可以使用它来创建您自己的各种形式。这个想法是让每个 JInternalFrame 的模态弹出窗口以安装在 JInternalFrame 上的透明玻璃窗格为中心出现。向透明玻璃窗格添加一个消耗鼠标事件的鼠标侦听器,这将为您提供模态功能#2(背景似乎没有响应)。使用 OO 而不是阻塞来获取功能 #1(让您的模态弹出窗口采用 IModalPopupListener(我做了这个 - 你必须创建它)对象在模态弹出窗口消失时回调)。
我希望这是有道理的!祝你好运!
这看起来很有希望:
编辑
回复您的评论(来自链接页面):
但是,有时您可能希望内部框架中的对话框是模态的。本技术提示将向您展示如何在内部框架中创建模式对话框。
这不正是您要寻找的吗?