【问题标题】:Simulating the Event Dispatch Thread模拟事件调度线程
【发布时间】: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) 提出问题。

标签: java swing jogl


【解决方案1】:

How to Use Root Panes: The Glass Pane 中,GlassPaneDemo 显示了方法redispatchMouseEvent() 中的一种方法。

【讨论】:

  • 太好了,成功了!显然对 pointConvert 的调用非常重要(我没有尝试过)。唯一不起作用的是 JTextField - 我不确定如何将 KeyEvents 转发到当前关注的组件。 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();似乎返回了没有帮助的 GLCanvas 。我可能只跟踪最后点击的组件,但我想知道是否有真正的方法可以做到这一点。
  • @Steve:我首先想到的是key bindings,但我没有在你的上下文中使用它们。
猜你喜欢
  • 2015-11-06
  • 2011-11-11
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多