加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:21:51 所属栏目:Java 来源:网络整理
导读:我将Swing和 Java3D结合在一起.挥杆组件的操作应使用事件调度程序线程完成,而Java3D组件的操作应在BehaviourSchedulerThread中完成. Java3D呈现场景,然后执行与场景相关联的所有行为. 我在Canvas3D上启用了MouseListener.事件发布到AWT事件队列中.然后我想根
我将Swing和 Java3D结合在一起.挥杆组件的操作应使用事件调度程序线程完成,而Java3D组件的操作应在BehaviourSchedulerThread中完成.

Java3D呈现场景,然后执行与场景相关联的所有行为.

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

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

这是正确的做法吗?

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

更新:
问题可以更清楚地定义如下:

我有一个JButton“spin cube”,它有一个ActionListener.一旦ActionListener被触发,它将AWTEvent推送到Java3D行为.一旦行为触发,它会修改场景图,然后修改JButton actionListener和文本,使其成为“停止旋转”.

>点击JButton两次.
>第一个AWTEvent被调度到SpinActionListener.立方体开始旋转,并将JButton actionListener修改为StopSpinningActionListener.
>第二个AWTEvent被派发到StopSpinningActionListener.立方体停止旋转,并将JButton actionListener修改为SpinActionListener.

实际发生的情况如下:

>点击一次JButton两次.两个AWTEvent都被调度到SpinActionListener.这将在J3D行为中创建一个Runnable来执行.
>第一个AWTEvent启动一个计时器来旋转立方体.然后将一个Runnable发布到EDT以修改按钮.
>第二个AWTEvent启动一个计时器来旋转立方体.立方体现在将旋转两倍.然后将一个Runnable发布到EDT以修改按钮.

显然,我不应该依赖于AWTEvent的顺序处理.因为任何SwingUtilities.invokeAndWait()会导致死锁,所以我不得不在EDT中等待这个行为.

解决方法

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

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

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

它监听Canvas3D的AWTEvents.可以选择两种选择之一:

> MouseListener with WakeupOnBehaviorPost or
> WakeupOnAWTEvent.

此代码示例可能有帮助.

通过SwingUtilities.invokeLater从Behavior.processStimulus方法内启动Swing组件更新不应该导致任何问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读