2011-07-09 6 views
3

私のアプリケーションでは、マウスとキーボードのイベントを不可視のJPanelに転送したいと思います.JPanelがEDTから来たかのように処理するようにしたいと思います。これは、アプリケーションがJOGLをレンダリングに使用するためのオプションの拡張機能を持っているためです。私はすでにSwingにGUIのものを書いているので、そのコードを再利用したいと思います。残念ながら、SwingとJOGLのGLCanvasを混在させることはできません(私はGLJpanelを使うことができますが、使用するには遅すぎます)。ただし、JOGLには、グラフィックスインスタンスを描画して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に転送するにはどうすれば適切な処理が行われるのですか? (すなわち、ボタンのアクションリスナーが活性化されるホバーするとき、ボタン等、異なるグラフィックを示し、)

任意のヒントを大幅How to Use Root Panes: The Glass Pane

+3

*「何かヒントをいただければ幸いです」* 1)息を飲む。 2)質問をする。 –

答えて

2

を理解されるであろう、GlassPaneDemoは方法で一つのアプローチを示しますredispatchMouseEvent()

+0

偉大な、それは働いた!どうやら、pointConvertの呼び出しは非常に重要です(私はそれらを試していない)。唯一動作しないのはJTextFieldです。KeyEventsを現在フォーカスされているコンポーネントに転送する方法についてはわかりません。 KeyboardFocusManager.getCurrentKeyboardFocusManager()。getFocusOwner();助けにならないGLCanvasを返すようです。私はおそらく、最後にクリックされたコンポーネントを追跡することができますが、それを行う本当の方法があるのだろうかと思います。 – Steve

+0

@Steve:私の最初の考えは[キーバインディング](https://sites.google.com/site/drjohnbmatthews/keypad-panel)ですが、私はあなたの文脈でそれらを使用していません。 – trashgod

関連する問題