结合Java Swing和Java3D:并发性能问题

时间:2012-01-13 08:34:43

标签: java swing concurrency java-3d

我将Swing和Java3D结合在一起。应使用Event Dispatcher Thread完成swing组件的操作,而Java3D组件的操作应在BehaviourSchedulerThread中完成。

Java3D渲染场景,然后执行与场景相关的所有行为。

我在Canvas3D上启用了MouseListener。事件将发布到AWT事件队列中。然后我想基于这些事件修改Java3D环境,所以我使用了一个特殊的行为,我可以将Runnable发布到。这样可以确保在Java3D的行为周期内执行Runnable(并且在渲染周期中不要修改任何内容)。

假设行为中的某些操作想要修改Swing模型。然后我必须向EDT发布一个新的Runnable。

这是正确的方法吗?

使用这种技术,我在鼠标监听器上遇到了很多问题。我在行为中更新了Java3D模型中的一个点,并且我同时更新了swing GUI。

更新: 问题可以更明确地定义如下:

我有一个JButton“旋转立方体”,它有一个ActionListener。一旦触发了ActionListener,它就会将AWTEvent推送到Java3D行为中。一旦行为触发,它就会修改场景图,然后将JButton actionListener和文本修改为“停止旋转”。

  1. 两次点击JButton。
  2. 第一个AWTEvent被调度到SpinActionListener。多维数据集开始旋转,JButton actionListener被修改为StopSpinningActionListener
  3. 第二个AWTEvent被调度到StopSpinningActionListener。立方体停止旋转,JButton actionListener被修改为SpinActionListener
  4. 实际发生的事情如下:

    1. 两次点击JButton。两个AWTEvent都会被发送到SpinActionListener。这将创建一个在J3D行为中执行的Runnable。
    2. 第一个AWTEvent启动一个计时器来旋转立方体。然后它将一个Runnable发布到EDT以修改按钮。
    3. 第二个AWTEvent启动一个计时器来旋转立方体。立方体现在旋转速度快两倍。然后它将一个Runnable发布到EDT以修改按钮。
    4. 显然,我不应该依赖于AWTEvent的顺序处理。我不能在EDT中等待触发行为,因为任何SwingUtilities.invokeAndWait()都会导致死锁。

1 个答案:

答案 0 :(得分:4)

哪个WakeupCriterion用于唤醒您的特殊行为对象?

Java 3D的源代码包括实用程序类

com.sun.j3d.utils.behaviors.mouse.MouseBehavior/MouseRotate 

侦听Canvas3D的AWTEvents。可以选择以下两种选择之一:

  1. MouseListener WakeupOnBehaviorPost
  2. WakeupOnAWTEvent
  3. 此代码示例可能会有所帮助。

    通过Behavior.processStimulusSwingUtilities.invokeLater方法中启动Swing组件更新不应导致任何问题。