结合JavaSwing和Java3D:并发性的性能问题

结合JavaSwing和Java3D:并发性的性能问题,java,swing,concurrency,java-3d,Java,Swing,Concurrency,Java 3d,我将Swing和Java3D结合在一起。swing组件的操作应使用事件调度程序线程完成,而Java3D组件的操作应在BehaviorSchedulerThread中完成 Java3D渲染场景,然后执行与场景关联的所有行为 我在Canvas3D上启用了鼠标侦听器。事件被发布到AWT事件队列中。然后我想基于这些事件修改Java3D环境,因此我使用了一种特殊的行为,可以将Runnable发布到。这确保在Java3D的行为周期中执行Runnable(并且在渲染周期中不修改任何内容) 假设行为中的某些操作

我将Swing和Java3D结合在一起。swing组件的操作应使用事件调度程序线程完成,而Java3D组件的操作应在BehaviorSchedulerThread中完成

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

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

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

这是正确的方法吗

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

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

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

  • 单击JButton两次
  • 第一个AWTEvent被分派到SpinActionListener。多维数据集开始旋转,JButton actionListener被修改为
    StopSpinningActionListener
  • 第二个AWTEvent被调度到StopSpinningActionListener。多维数据集停止旋转,JButton actionListener被修改为
    SpinActionListener
  • 实际发生的情况如下:

  • 单击JButton两次。两个
    AWTEvent
    s都被分派到
    SpinActionListener
    。这将创建一个可在J3D行为内部执行的Runnable
  • 第一个AWTEvent启动计时器旋转立方体。然后,它向EDT发布Runnable以修改按钮
  • 第二个AWTEvent启动计时器旋转立方体。立方体现在将以两倍的速度旋转。然后,它向EDT发布Runnable以修改按钮

  • 显然,我不应该依赖于AWTEvent的顺序处理。我不能在EDT中等待行为触发,因为任何SwingUtilities.invokeAndWait()都将导致死锁

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

    Java3D的源代码包括实用程序类

    com.sun.j3d.utils.behaviors.mouse.MouseBehavior/MouseRotate 
    
    收听Canvas3D的
    AWTEvents
    。可以从两个备选方案中选择一个:

  • MouseListener
    WakeupOnBehaviorPost
  • WakeupOnAWTEvent
    此代码示例可能会有所帮助


    通过
    SwingUtilities.invokeLater
    Behavior.processStimulus
    方法中启动Swing组件更新应该不会引起任何问题。

    据我所知,基于OpenGL(其克隆)的3D_API需要使用AWT容器,并小心地放置在一个容器中(意思是JPanel而不是JFrame、JDialog或JWindow),感谢您对WakeupOnAWTEvent的提示。查看源代码,我分别实现了相同的功能;始终很高兴不重复API功能。