2012-01-13 9 views
10

私は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が「停止回転」に変更されます。

  1. JButtonを2回クリックします。
  2. 最初のAWTEventがSpinActionListenerにディスパッチされます。キューブが回転を開始し、JButtonのactionListenerがStopSpinningActionListenerに変更されます。
  3. 2番目のAWTEventがStopSpinningActionListenerにディスパッチされます。キューブの回転が停止し、JButtonのactionListenerがSpinActionListenerに変更されます。二回のJButtonの

    1. クリック:実際に何が起こる

    は次のとおりです。 にはAWTEventの両方が送信されます。これにより、J3Dビヘイビア内で実行するRunnableが作成されます。

  4. 最初のAWTEventはキューブを回転させるタイマーを開始します。その後、EDTにRunnableをポストしてボタンを変更します。
  5. 2番目のAWTEventは、キューブを回転させるタイマーを開始します。キューブは現在、2倍の速さで回転します。その後、EDTにRunnableをポストしてボタンを変更します。

明らかに、私は、AWTEventの処理を順番に処理する必要はありません。私はEDTで動作を開始するのを待つことはできません。SwingUtilities.invokeAndWait()がデッドロックを引き起こすためです。

+1

私は、OpenGL(そのクローン)に基づく3D_APIを知っていて、AWTコンテナの使用が必要です。http://java.sun.com/products/jfc/tsc/articles/mixing/を1つのコンテナに入れてください(JFrame、JDialog、JWindowではなくJPanelを意味します) – mKorbel

答えて

4

あなたの特別な行動オブジェクトを起動するのに、WakeupCriterionが使用されていますか?

は、Java 3Dのソースコードは、ユーティリティクラス

Canvas3Dの AWTEventsに耳を傾け
com.sun.j3d.utils.behaviors.mouse.MouseBehavior/MouseRotate 

が含まれています。二つの選択肢の一つを選ぶことができます。

  1. MouseListenerWakeupOnBehaviorPostまたは
  2. WakeupOnAWTEvent

このコードサンプルは参考になる場合があります。

メソッド内からのSwingコンポーネントの更新の開始は、SwingUtilities.invokeLaterであれば問題ありません。

+0

WakeupOnAWTEventのヒントをありがとうございます。ソースコードを見ると、同じことを別々に実装しました。常にAPI機能を重複しないようにしてください。 – parasietje

関連する問題