2012-02-20 89 views
1

我們有一個應用程序,作爲它的第一個UI動作,顯示一個沒有父框架的模態JDialog。modal parentless JDialog不抓焦點

public LoginDialog(Frame owner, Config config, Object... params) { 
    super((Frame)null, true); 

不幸的是,當它出現時,儘管它出現在前面,但它並沒有抓住焦點。

因此,用戶在通過雙擊開始菜單啓動應用程序後,必須使用鼠標來選擇「登錄」對話框並輸入信息。

有沒有辦法讓這個JDialog抓住焦點,當它出現在前面?

我曾嘗試調用「requestFocus」之前,之後,並通過invokeLater「期間」調用setVisible(true) - 但這些都沒有任何影響。

我們如何讓模態對話框抓住焦點?

更新:問題是用於嘗試呈現背景「等待窗口」的代碼。該窗口顯示在登錄對話框的「後面」,以便當對話消失時用戶將看到「請稍候」消息。由於它是應用程序創建的第一個窗口,因此它成爲焦點。我不確定是否會有辦法讓對話在事件調度線程中再次成爲焦點 - 但我通過不破解它並正確地執行操作來修復它。

+0

我們使用[requestFocusInWindow()](http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/JComponent.html#requestFocusInWindow())而不是requestFocus()。希望可以幫助。 – 2012-02-20 09:33:23

+0

應該只是沒有任何額外的代碼工作,無法重現所描述的問題 – kleopatra 2012-02-20 09:50:18

回答

2

首先,它有點奇怪,模態對話框是無父母的。模態對話框中的要點是,它顯示在其父項上,不允許訪問父項。

所以,第一個建議是使它不是模態的。我相信它會起作用。

順便說一句我剛剛嘗試創建這樣的對話框,並沒有焦點問題。嘗試可能會簡化您的代碼:

JDialog d = new JDialog(); 
    d.setSize(200, 200); 
    d.setVisible(true); 

這適用於我,我相信會爲你工作。現在開始改變這個簡單的代碼來實現你真正的應用代碼。在某些時候它會停止工作,你會看到問題出在哪裏。

如果沒有什麼有助於嘗試使用我在article中描述的技巧。尋找標題「便攜式窗口激活」。我希望這會有所幫助。

+1

是的我做作的例子確實工作...事情是還有一個「閃屏」,首先顯示登錄提示之前 - 我懷疑這是搞亂莫名其妙地關注焦點。 – 2012-02-20 10:02:42

1

1)必須創建JDialog內容幷包裹內部invokeLater()

或最好和safiest方式示出容器

2)你必須爲ModalityTypesModal for parent

3)只有一組從容器可能是Modal在應用程序生命週期