【发布时间】:2011-07-09 22:02:50
【问题描述】:
在我的应用程序中,我想将鼠标和键盘事件转发到不可见的 JPanel,并且我希望 JPanel 处理它们,就好像它们来自 EDT。这样做的原因是因为应用程序有一个可选的扩展来使用 JOGL 进行某些渲染。我已经在 Swing 中编写了 GUI 内容,因此我想重用该代码。不幸的是,您不能将 Swing 与 JOGL 的 GLCanvas 混合使用(我可以使用 GLJpanel,但这太慢而无法使用)。不过,JOGL 确实有一个功能(覆盖),它允许您绘制到 Graphics 实例以使其在 GL 上下文中绘制。所以我可以调用 jpanel.paint(g) 使用可以正常工作的叠加层将其绘制到屏幕上。剩下的唯一难题是如何使用 GLCanvas 上的鼠标和键盘侦听器来接收事件并将其转发给 JPanel。
我尝试使用 findComponentAt(mousex, mousey) 来获取 JPanel 上特定位置的组件,然后调用 dispatchEvent 到该组件,但组件不会对鼠标单击或任何操作做出反应。我假设 EDT 进行了某种从 MouseEvent/KeyEvent 到 ActionEvent 的转换,以使按钮和文本字段正常工作。如果最坏的情况发生,我可以测试该组件是否是 JButton 并使用 doClick 至少会给我一些功能。但这不适用于非按钮组件,也不会做任何按钮悬停等。我知道我可能应该为此使用 OpenGL GUI 工具包(例如 FengGUI),但我依赖于 Swing 的 HTML 渲染功能,我不想尝试重写该代码。
如何正确接收来自 GLCanvas' 的 MouseEvents 并将它们转发到 JPanel 以便进行适当的处理? (即,按钮的动作监听器被激活,按钮在悬停时显示不同的图形等)
任何提示将不胜感激
【问题讨论】:
-
“任何提示将不胜感激” 1) 深呼吸。 2) 提出问题。