私はSwingとJava3Dを組み合わせています。スイングコンポーネントの操作はイベントディスパッチャスレッドを使用して行い、Java3Dコンポーネントの操作はBehaviourSchedulerThreadで行う必要があります。Java SwingとJava3Dを組み合わせる:同時実行性のパフォーマンス上の問題
Java3Dはシーンをレンダリングして、そのシーンに関連付けられたすべての動作を実行します。
私はCanvas3DでMouseListenerを有効にしています。イベントはAWTイベントキューにポストされます。これらのイベントに基づいてJava3D環境を変更したいので、私はRunnableを投稿できる特別なBehaviorを使用します。これにより、RunnableがJava3Dの動作サイクル中に実行されることが保証されます(また、Renderサイクル中は何も変更しないでください)。
Behaviorの一部の操作でSwingモデルを変更したいとします。私はEDTに新しいRunnableを投稿する必要があります。
これは正しい方法ですか?
この手法を使用すると、マウスリスナーで多くの問題が発生します。 Java3Dモデル内のポイントを動作で更新し、同時にスイングGUIを更新します。
更新: 次のような問題は、より明確に定義することができます。
私はActionListenerを持っているのJButton「スピンキューブ」を持っています。 ActionListenerが起動すると、AWTEventがJava3Dの動作にプッシュされます。ビヘイビアが起動すると、シーングラフが変更され、JButtonのactionListenerとtextが「停止回転」に変更されます。
- JButtonを2回クリックします。
- 最初のAWTEventがSpinActionListenerにディスパッチされます。キューブが回転を開始し、JButtonのactionListenerが
StopSpinningActionListener
に変更されます。 - 2番目のAWTEventがStopSpinningActionListenerにディスパッチされます。キューブの回転が停止し、JButtonのactionListenerが
SpinActionListener
に変更されます。二回のJButtonの- クリック:実際に何が起こる
は次のとおりです。 には
AWTEvent
の両方が送信されます。これにより、J3Dビヘイビア内で実行するRunnableが作成されます。 - 最初のAWTEventはキューブを回転させるタイマーを開始します。その後、EDTにRunnableをポストしてボタンを変更します。
- 2番目のAWTEventは、キューブを回転させるタイマーを開始します。キューブは現在、2倍の速さで回転します。その後、EDTにRunnableをポストしてボタンを変更します。
明らかに、私は、AWTEventの処理を順番に処理する必要はありません。私はEDTで動作を開始するのを待つことはできません。SwingUtilities.invokeAndWait()がデッドロックを引き起こすためです。
私は、OpenGL(そのクローン)に基づく3D_APIを知っていて、AWTコンテナの使用が必要です。http://java.sun.com/products/jfc/tsc/articles/mixing/を1つのコンテナに入れてください(JFrame、JDialog、JWindowではなくJPanelを意味します) – mKorbel