2011-07-09 44 views
3

在我的應用程序中,我想將鼠標和鍵盤事件轉發給不可見的JPanel,我希望JPanel像處理EDT一樣處理它們。原因是因爲應用程序有一個可選的擴展名來使用JOGL進行一些渲染。我已經在Swing中編寫了GUI的東西,所以我想重用這些代碼。不幸的是,你不能將Swing和JOGL的GLCanvas混合使用(我可以使用GLJpanel,但這太慢了,無法使用)。 JOGL確實有一個特性(Overlay),它可以讓你繪製一個Graphics實例來繪製GL上下文。所以我可以調用jpanel.paint(g)使用可以正常工作的疊加層將其繪製到屏幕上。剩下的唯一難題是以某種方式使用GLCanvas上的鼠標和鍵盤監聽器來接收和轉發事件到JPanel。模擬事件調度線程

我已經嘗試使用findComponentAt(mousex,mousey)在特定位置上獲取JPanel上的組件,然後調用dispatchEvent到該組件,但組件不響應鼠標單擊或任何事情。我假設EDT做了一些從MouseEvent/KeyEvent到ActionEvent的轉換,以使按鈕和文本框正常工作。如果最壞的情況出現,我可以測試組件是不是JButton,並使用doClick,它至少會給我一些功能。但這不適用於非按鈕組件,它不會執行任何按鈕懸停等。我知道我應該爲這個(例如,FengGUI)使用一個OpenGL GUI工具包,但是我依賴於Swing的HTML渲染功能,我不想重寫那些代碼。

如何正確接收GLCanvas中的MouseEvent並將它們轉發給JPanel,以便進行正確的處理? (即,用於按鈕的動作偵聽器被激活時,按鈕顯示不同的圖形時懸停等)

任何提示,將不勝感激

+3

*「任何提示將不勝感激」* 1)呼吸一下。 2)提出問題。 –

回答

2

How to Use Root Panes: The Glass PaneGlassPaneDemo示出了在該方法的一種方法redispatchMouseEvent()

+0

太棒了,工作!顯然,對pointConvert的調用是非常重要的(我沒有嘗試過)。唯一不起作用的就是JTextField - 我不知道如何將KeyEvent轉發到當前集中的組件。 。KeyboardFocusManager.getCurrentKeyboardFocusManager()getFocusOwner();似乎返回GLCanvas,這沒有幫助。我可能只是跟蹤最後點擊的組件,但我想知道是否有真正的方法來做到這一點。 – Steve

+0

@Steve:我首先想到的是[鍵綁定](https://sites.google.com/site/drjohnbmatthews/keypad-panel),但我沒有在你的上下文中使用它們。 – trashgod