微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以让 JFrame 获得焦点,而无需每次都将其置于最前面?

如何解决是否可以让 JFrame 获得焦点,而无需每次都将其置于最前面?

我试图将某个 JFrame 保留在仅 一个 其他 JFrame 之上,而不是所有 JFrame 和 jdialogs 之上。因此,我有 jFrame1 和 jFrame2。我希望 jFrame2 始终位于 jFrame1 之上,即使我单击按钮并在 jFrame1 上执行其他操作。但是,如果 jFrame1 启动一个对话框,我希望该对话框隐藏在 jFrame2 后面。因此,为 jFrame2 设置“Always on Top”属性是不够的,因为我希望 jFrame2 只停留在 jFrame1 之上,而不是每个帧和对话框。

所以,这引出了我的问题:在 Java 中是否有可能通过单击 JFrame (jFrame1) 或它发生的方式来聚焦它,而不会同时将它带到前面(从而覆盖 jFrame2)?本质上,我想做与 this 相反的事情。我尝试了几种解决方案。一个不起作用,另一个不理想。

我的第一次尝试涉及在我的 jFrame1 中覆盖已弃用的 show() 方法,以便它不会调用 toFront() 方法。这不起作用,因为我认为,当 JFrame 获得焦点时, show() 方法永远不会被调用。我试图在获得焦点时在 Java 源代码中追踪任何类型的 toFront() 或类似调用的位置,但没有产生任何结果。我不确定在获得焦点时从哪里调用“发送到前台”行为。

我的第二次尝试适用于我想要它做的事情,但有一个不理想的副作用。第二个解决方案涉及在 jFrame1 上实现 WindowFocusListener,然后填充 windowGainedFocus(WindowEvent e) 方法使用以下代码,其中 shouldAlwaysBeOnTop() 只是一个标志的 getter,指示我希望何时发生此行为:

public void windowGainedFocus(WindowEvent e) {
    if (jFrame2.shouldAlwaysBeOnTop()) {
        jFrame2.toFront();
    }
}

这基本上是 this solution,它完成了我想要它做的事情,但它首先让 jFrame2 窗口非常短暂地不显示(因为它失去焦点)然后很快再次显示(因为我在上面调用 toFront()))。这会导致 jFrame2 窗口在每次单击 jFrame1 时都非常快速地“闪烁”或“闪烁”。尽管否则这会按照我的意愿工作,但闪烁行为是不可取的。 (当从 jFrame1 显示对话框时,jFrame2 暂时消失,直到该对话框被用户处理并关闭。然后 jFrame2 重新出现。我对这种行为很好,但在这种情况下 jFrame2 没有必要消失 - 我是在这种情况下只是对其漠不关心)。

那么,有没有更好的方法可以让 jFrame2 始终位于 jFrame1 之上,同时仍然能够与 jFrame1 交互并让它显示未被 jFrame2 覆盖的对话框(无论对话框是否为暂时在 jFrame2 之上或 jFrame2 暂时消失)?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。