java—有没有可能允许jframe在每次都不显示在前面的情况下进行聚焦?

myzjeezk  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(460)

我试图将某个jframe放在另一个jframe之上,而不是放在所有jframe和jdialog之上。因此,我有jframe1和jframe2。我希望jframe2始终位于jframe1之上,即使我在jframe1上单击按钮和执行其他操作。但是,如果jframe1启动一个对话框,我不希望该对话框隐藏在jframe2后面。因此,为jframe2设置“always on top”属性是不够的,因为我希望jframe2只位于jframe1的顶部,而不是每个帧和对话框。
因此,这就引出了我的问题:在java中,是否可以通过单击jframe(jframe1)或以任何方式聚焦它,而不同时将它置于前面(从而覆盖jframe2)?基本上,我想做与此相反的事情。我试过几种解决办法。一个不起作用,另一个不理想。
我的第一次尝试涉及重写jframe1中不推荐使用的show()方法,以便它不会调用tofront()方法。这不起作用,因为我推测,当jframe获得焦点时,show()方法永远不会被调用。我试图在java源代码中找到在获得焦点时进行任何tofront()或类似调用的位置,但没有得到任何结果。我不确定在获得焦点时,从何处调用“发送到前端”行为。
我的第二次尝试对我想要的效果有效,但是有一个不理想的副作用。第二个解决方案涉及在jframe1上实现一个windowfocuslistener,然后用以下代码填充windowgainedfocus(windowevent e)方法,其中shouldallwaysBeantop()只是一个标志的getter,该标志指示我希望此行为何时发生:

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

这基本上就是这个解决方案,它完成了我想要它做的事情,但是它首先需要让jframe2窗口非常短暂地不显示(因为它失去焦点),然后非常快速地再次显示(因为我在上面调用了tofront())。这会导致每次单击jframe1时jframe2窗口都快速“闪烁”或“闪烁”。尽管这是我想要的工作方式,但闪烁行为是不可取的(当jframe1显示一个对话框时,jframe2会立即消失,直到用户处理并关闭该对话框。然后jframe2再次出现。我对这种行为很满意,但jframe2在这种情况下没有必要消失——在这种情况下,我只是对它漠不关心)。
那么,有没有更好的方法可以让jframe2始终位于jframe1之上,同时仍然能够与jframe1交互,并让它显示jframe2未覆盖的对话框(无论对话框是暂时位于jframe2之上还是jframe2暂时消失)?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题