我有一个由许多 JFrames 组成的 Java swing 程序,我知道这不是最好的设计,但它可以完成工作。
如果我打开另一个程序,例如 Firefox,并最大化该窗口,我的 JFrames 是不可见的。
现在,当我单击其中一个 JFrame 的窗口任务栏上的按钮时,JFrame 会弹出。
当这个 JFrame 弹出窗口时,我需要检查我的其他 JFrame 是否可见,我的意思是在 Firefox 窗口前面。
我尝试了
isVisible()
、isShowing()
和 isDisplayable()
,但即使 JFrame 位于 Firefox 窗口下方,它们也总是返回 true。这在阅读 Java 文档时很有意义。
但我似乎无法找到一种方法来告诉我我的 JFrame 是否真的在 Firefox 窗口前可见。
这让我很困惑。
Firefox 覆盖的 JFrame 具有以下属性:
14:50:08,129 DEBUG DrawFrame - isVisible: true
14:50:08,129 DEBUG DrawFrame - isDisplayable: true
14:50:08,129 DEBUG DrawFrame - isShowing: true
只是为了解释我的目标:我有多个 JFrame,当我单击窗口任务栏上的一个特定 JFrame 按钮时,我想检查用户是否可以看到另一个 JFrame。如果它对用户不可见(例如,当被另一个程序覆盖时),我想让它可见。使其可见很简单:WindowListener windowActivated 并在不可见的框架上调用 toFront,当然这会在另一个 JFrame 再次激活时导致循环(调用 windowActivated > toFront > windowActivated > toFront,等等)。这就是为什么我需要在调用 toFront 方法之前检查可见性。
我不知道 Java 中有一个函数可以检查用户是否可以看到窗口,所以going native 可能是唯一的解决方案。
使用
windowGainedFocus
/LostFocus
来自WindowFocusListener
在
Window[] wins = Window.getWindows();
的数组中循环,返回当前JVM中的所有顶级容器
确保通过测试循环
if (wins[i] instanceof JFrame) {
(或JDialog
/JWindow
...)