2011-05-31 88 views
2

我有一個JTextField和AWT Canvas的簡單GUI(爲了防止爲什麼我使用AWT Canvas的反問題:我需要有一個窗把手)。AWT Canvas無法獲得另一個可聚焦組件的存在焦點

畫布是處理輸入事件,這意味着它必須是可以聚焦的。我通過在構造函數中使用setFocusable(true)來保證這一點,後來使用isFocusable()進行檢查確認它確實是可以聚焦的。

現在,JTextField在GUI打開時默認獲得焦點。到目前爲止我沒有問題。但是,沒有辦法從該JTextField獲取遠離的焦點。

文章"The AWT Focus Subsystem"明確指出,如果點擊某個可調焦組件,它將獲得焦點。這不會發生,事實上,只有當窗口被取消激活並再次激活時,我纔會收到零焦點更改事件,但是焦點會立即返回到JTextField。

顯式調用requestFocus()requestFocusInWindow()也沒有幫助,後者總是返回false

如果我替換JTextField,我已經獲得了與任何可聚焦組件相同的結果。如果Canvas是唯一可以調焦的容器,那麼一切正常,因爲它始終有焦點。

我失去了一些東西在這裏?有沒有什麼辦法可以讓我的Canvas增益聚焦在另一個可聚焦組件的存在下,最好是不讓這個聚焦組件變焦?

+0

你確定'setEnabled(true)'確定嗎?你可以用'isEnabled'來檢查。 – toto2 2011-05-31 13:52:23

+0

是的,它已啓用。如果Canvas本身就在那裏,這一切都可以正常工作。就在其他可聚焦組件/剛剛用JButton嘗試過時,稍後會編輯主要問題)就會參與其中,但它根本無法獲得重點。 – pdinklag 2011-06-01 04:46:41

回答

1

對不起,遺漏了一些信息,結果是問題的根源。

如上所述,我使用重量級組件,所以我有一個窗口句柄。我需要一個,因爲它被傳遞給本地庫中的OpenGL應用程序,AWT畫布隨後被用作渲染畫布。

在Windows中,Java使用GWLP_USERDATA窗口字段存儲指向AWTComponent對象的指針。但是,OpenGL應用程序會覆蓋該字段以存儲其自己的Window對象指針,這當然會破壞所有AWT相關的功能。

我通過創建自定義窗口消息處理程序將傳入消息委託給OpenGL應用程序和Java的AWT部件來解決此問題。

1

基本上在擺動焦點獲得第一。在最完整的GUI留在頂部

(ToRight)JComponents,如果有(與創建JComponents一起)添加監聽到JComponents,那麼這些監聽器(FE文件)可以採取重點...

但對我起作用:

last lines in something class about JComponets .. 

myFrame.pack(); 
myFrame.setVisible(true); 
Runnable doRun = new Runnable() { 

    public void run() { 
     myComponent.grabFocus(); 
     myComponent.requestFocus();//or requestFocusInWindow 
    } 
}; 
SwingUtilities.invokeLater(doRun); 
+0

那麼,即使假設這是有效的,這會給我的Canvas默認的焦點*。一旦人們使用文本字段,我會再次遇到同樣的問題:Canvas如何重新獲得焦點? 我已經嘗試添加一個鼠標監聽器的畫布要求焦點一旦點擊,沒有運氣('requestFocusInWindow'總是返回'false','requestFocus'也不會做任何事情)。 順便說一下,那個方法'grabFocus'不存在(我沒有使用JComponent,而是'java.awt.Canvas'。 – pdinklag 2011-06-01 04:49:46

+0

@pdinklag最簡單的就是...,我認爲真的要發佈時間代碼顯示了我們嘗試過的內容,取決於Canvas如何添加到另一個JPanel,JSchrollPane ... – mKorbel 2011-06-01 06:05:01