0

我的应用程序是一个打开 JFrame 的 JApplet。小程序有一个侦听器和一个按钮,因此如果框架移到另一个窗口后面(失去焦点),用户只需单击按钮即可将其移到前面。 frame.toFront();这工作正常。

但最初(在小程序中public void init() {}),在调用后frame.setVisible(true);我调用frame.toFront();以确保它从前面开始。但是,该框架随后会立即移到浏览器后面。不过,按下按钮会回调它。我已经尝试运行一个单独的线程,该线程重复调用frame.toFront(); 但是一旦停止,框架就会在浏览器后面。只有当按钮被按下时,它才会来到前面,并保持在前面。此外,让循环或时间持续保持在前面并不是一个好的选择,因为用户可能需要或想要让它故意落后。这个“错误”在 Mac(运行 Java 1.5)上不存在,但在 Windows(运行 1.6)上 - 包括 IE、FF、Chrome、Safari,但不存在 Opera(奇怪)。

可能的原因和解决方法?

4

2 回答 2

0

您是否在框架上尝试过 setAlwaysOnTop(true) ?但是,我不确定在从小程序创建的框架或窗口上是否允许这样做。

于 2009-10-21T14:20:34.647 回答
0

解决了setAlwaysOnTop(true)一个问题,但创建了另一个问题,即现在用户无法将窗口实际发送到后面。

我的解决方案是 hack:在附加到 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() 方法启动相同类型的线程时,窗口在线程结束后还是回到了后面?

于 2009-10-22T15:44:26.973 回答