我的应用是一个打开JFrame的JApplet。 applet有一个监听器和一个按钮,这样如果框架落在另一个窗口后面(失去焦点),用户只需单击该按钮即可使其显示在前面。 frame.toFront();
这很好用。
但最初(在applet的public void init() {}
中),
在致电frame.setVisible(true);
后,我致电frame.toFront();
以确保它在前面开始。然而,框架然后立即在浏览器后面。然而,按下按钮会将其调回。
我试过运行一个单独的线程,它反复调用frame.toFront();
但是一旦停止,框架就会在浏览器后面移动。只有按下按钮才会到达前面,并保持在前面。此外,有一个循环或时间持续保持在前面不是一个好的选择,因为用户可能需要或想要故意让它落后。
这个“bug”不存在于Mac上(运行Java 1.5),但在Windows上(运行1.6) - 包括IE,FF,Chrome,Safari,但不包括Opera(奇怪)。
可能的原因和解决方法?
答案 0 :(得分:0)
你在框架上尝试过setAlwaysOnTop(true)吗?但是,我不确定是否允许从applet创建的框架或窗口。
答案 1 :(得分:0)
setAlwaysOnTop(true)
解决了一个问题,但创建了另一个问题,即现在用户无法将窗口实际发送到后面。
我的解决方案是一个黑客: 在附加到JFrame的WindowListener中,放置以下代码:
@Override
public void windowDeactivated(WindowEvent e)
{
if(firstToBack) //firstToBack is an bloolean instance variable initialized to true
{
final JFrame f = frame;
new Thread() { public void run() {
try { Thread.sleep(300); } catch(InterruptedException ie) {}
f.toFront();
}}.start();
firstToBack = false;
}
}
这基本上是第一次启动一个新的Thread,稍等一会然后将JFrame调到前面。它只执行一次,因此每次用户将帧发送到后面时,帧都不会保持在前面。 300毫秒是一段任意的时间,甚至可能都没有必要。
也许有人可以告诉我为什么会这样,但是当applet的init()方法启动同一种线程时,在线程结束后,窗口仍然会转到后面?