2009-10-21 33 views
0

我的應用程序是一個打開JFrame的JApplet。該applet有一個監聽器和一個按鈕,所以如果幀落在另一個窗口的後面(放鬆焦點),用戶可以簡單地點擊按鈕使其到達前面。 frame.toFront();這工作正常。JFrame消失在applet的瀏覽器窗口後面

但在最初(在applet的​​), 調用frame.setVisible(true);後,我打電話給frame.toFront();,以確保它開始在前面。然而,該框架立即在瀏覽器後面。不過,按下按鈕會回調它。 我試過了一個獨立的線程,它反覆調用frame.toFront();但是一旦停止,框架就反正回到瀏覽器後面。只有當按鈕被按下時,它纔會到達前面,並保持在前面。另外,有一個循環或時間不斷地把它放在前面並不是一個好的選擇,因爲用戶可能需要或有意將它放在後面。 這個「bug」在Mac(運行Java 1.5)上不存在,但在Windows(運行1.6)上 - 包括IE,FF,Chrome,Safari,而不是Opera(奇怪)。

可能的原因和解決方法?

回答

0

您是否在框架上嘗試過setAlwaysOnTop(true)?但我不確定,如果這是允許從applet創建的框架或窗口。

+0

不,這是不允許的。 – 2009-10-21 16:45:20

0

setAlwaysOnTop(true)解決了一個問題,但創建了另一個問題,即現在用戶無法實際發送窗口到後面。

我sollution是一個黑客: 在附着到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; 
    } 
} 

這基本上啓動一個新線程第一次,它等待一點點,然後調用的JFrame到面前。它只執行一次,所以每次用戶將其發送到後面時,幀都不會到達前端。 300毫秒是一段任意的時間,甚至可能不是必需的。

也許有人可以告訴我爲什麼這會起作用,但是當applet的init()方法啓動了相同類型的線程時,窗口在線程結束之後又回到了後面?