2011-01-25 87 views
13

我正在編寫一個定期彈出JFrame的Java應用程序(Swing GUI)。是否有可能將JFrame放在前面而不是重點?

是否有可能以某種方式將窗口放在前面(foo.setAlwaysOnTop(true)會更好),但沒有它的焦點?

有些人不時地從屏幕上移開他們的眼睛,在打字的時候看着他們的鍵盤,我敢肯定,如果這個窗口總是捕捉到鍵盤的焦點,人們會因此而感到非常惱火,每當它突然出現時,就會丟失不少按鍵。

在其他情況下,即使用戶實際上無需始終查看鍵盤也能夠打字,彈出窗口並獲得焦點可能會從彈出窗口本身引起不必要的操作(某些Tab + Enter例如,用戶不小心選擇了一個她真的不會選擇的選項)。

提前致謝!

更新

約拿表明,foo.setFocusableWindowState(false);似乎工作,如果稱爲窗口已經呈現後(僅在Gnome的測試)。

這不起作用:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
foo.setFocusableWindowState(true); 

然而,這確實

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
Thread.sleep(1000); 
foo.setFocusableWindowState(true); 

我得看看是否有一個事件我能趕上/聽,讓我適當時,請執行foo.setFocusableWindowStatue(true);

我認爲我的問題解決了。

+1

你有沒有找到一個事件來聽取幀的渲染? – lordoku 2014-10-02 01:26:55

+0

有沒有人找到一個事件來聽聽這裏的工作? – wrslatz 2017-09-27 14:19:31

回答

13

這可能工作:

foo.setFocusableWindowState(false); 
+0

這實際上似乎工作,但我要麼必須設置一個計時器或找到一些事件來聽,當允許我`setFocusableWindowState`回到`true`時。 – 2011-01-25 10:22:12

+0

@Johann你也可以嘗試使用`Window`而不是`JFrame`。我認爲你有更多的可能性來控制焦點。 – Jonas 2011-01-25 10:25:50

0

建議:在創建框架下的GUI組件,把連續2個呼叫:

frameJustCreated.requestFocus(); 
this.requestFocus(); 

1日一個帶來新JFrame的窗口頂端,第二個保持用戶在頂部輸入的窗口。

1

我最近遇到了同樣的問題,並試探性的解決方案是:

JFrame frame = ...; 
frame.setExtendedState(JFrame.NORMAL); 
frame.setAlwaysOnTop(true); 
frame.requestFocus(); 
frame.setAlwaysOnTop(false); 
2

從Java 1.7,你可以撥打

frame.setAutoRequestFocus(false); 
0

如果你想打電話setFocusableWindowState(真)在一個事件(所以不要等待例如1秒),你可以添加一個WindowListener(例如派生自WindowAdapter)來改變屬性:

appFrame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      super.windowOpened(e); 
      e.getWindow().setFocusableWindowState(true); 
     } 
    }); 

    appFrame.setFocusableWindowState(false); 
    appFrame.setVisible(true); 
相關問題