2012-01-13 19 views
10

के साथ प्रदर्शन समस्याएं मैं स्विंग और जावा 3 डी को एक साथ जोड़ रहा हूं। स्विंग घटकों के मैनिपुलेशन इवेंट डिस्पैचर थ्रेड का उपयोग करके किया जाना चाहिए, जबकि जावा 3 डी घटकों के हेरफेर BehaviourSchedulerThread में किया जाना चाहिए।जावा स्विंग और जावा 3 डी को संयोजित करें: समरूपता

जावा 3 डी दृश्य प्रस्तुत करता है और फिर दृश्य से जुड़े सभी व्यवहार निष्पादित करता है।

मेरे पास Canvas3D पर एक MouseListener सक्षम है। घटनाक्रम एडब्ल्यूटी इवेंट कतार में पोस्ट किए गए हैं। मैं फिर इन घटनाओं के आधार पर Java3D वातावरण को संशोधित करना चाहता हूं, इसलिए मैं एक विशेष व्यवहार का उपयोग करता हूं जहां मैं रननेबल को पोस्ट कर सकता हूं। यह सुनिश्चित करता है कि Run3able Java3D के व्यवहार चक्र के दौरान निष्पादित किया गया है (और रेंडर चक्र के दौरान किसी भी चीज को संशोधित न करें)।

मान लीजिए व्यवहार में कुछ संचालन स्विंग मॉडल को संशोधित करना चाहते हैं। मुझे फिर ईडीटी में एक नया रननेबल पोस्ट करना होगा।

क्या यह करने का सही तरीका है?

इस तकनीक का उपयोग करके, मुझे माउस श्रोता पर बहुत सारी समस्याएं आती हैं। मैं व्यवहार में अपने जावा 3 डी मॉडल में एक बिंदु अद्यतन करता हूं, और मैं एक ही समय में स्विंग जीयूआई अपडेट करता हूं।

अद्यतन: समस्या अधिक स्पष्ट रूप से इस प्रकार के रूप में परिभाषित किया जा सकता है:

मैं एक JButton "स्पिन घन" जो एक ActionListener है की है। एक बार जब एक्शनलिस्टर को निकाल दिया जाता है, तो यह AWTEvent को Java3D व्यवहार में धक्का देता है। एक बार व्यवहार की आग लगने के बाद, यह दृश्य ग्राफ को संशोधित करता है और फिर जेबटन एक्शन लिस्टनर और टेक्स्ट को "कताई रोकना" बनने के लिए संशोधित करता है।

  1. जेबटन पर दो बार क्लिक करें।
  2. पहला एडब्ल्यूटीई स्पिनएक्शन लिस्टनर को भेज दिया जाता है। क्यूब कताई शुरू होता है और जेबटन एक्शन लिस्टर को StopSpinningActionListener में संशोधित किया जाता है।
  3. दूसरा AWTEvent StopSpinningActionListener को भेजा जाता है। क्यूब कताई बंद कर देता है और जेबटन एक्शन लिस्टर को SpinActionListener में संशोधित किया जाता है। दो बार एक JButton पर

    1. क्लिक करें:

    क्या वास्तव में होता है निम्नलिखित है। AWTEvent दोनों SpinActionListener पर प्रेषित हो गए हैं। यह जे 3 डी व्यवहार के अंदर निष्पादित करने के लिए एक रननेबल बनाता है।

  4. पहला AWTEvent घन को घुमाने के लिए टाइमर शुरू करता है। फिर यह बटन को संशोधित करने के लिए ईडीटी के लिए एक रननेबल पोस्ट करता है।
  5. दूसरा AWTEvent घन स्पिन करने के लिए टाइमर शुरू करता है। क्यूब अब तेजी से दोगुना हो जाएगा। फिर यह बटन को संशोधित करने के लिए ईडीटी के लिए एक रननेबल पोस्ट करता है।

जाहिर है, मुझे अनुक्रमिक रूप से संसाधित होने पर AWTEvent की प्रक्रिया के आधार पर नहीं होना चाहिए। मैं व्यवहार के लिए ईडीटी में इंतजार नहीं कर सकता, क्योंकि किसी भी SwingUtilities.invokeAndWait() तब डेडलॉक का कारण बन जाएगा।

+1

जैसा कि मुझे पता है और ओपनजीएल (इसके क्लोन) के आधार पर 3D_APIs के लिए प्रयास किया गया है, उसे एडब्ल्यूटी कंटेनर का उपयोग करने की आवश्यकता है, ध्यान से http://java.sun.com/products/jfc/tsc/articles/mixing/ एक कंटेनर में रखा गया है (जिसका अर्थ जेपीएनएल जेएफआरएएम, जेडियलोग या जेविंडो नहीं है), – mKorbel

उत्तर

4

कौन सा WakeupCriterion आपके विशेष व्यवहार ऑब्जेक्ट को जागृत करने के लिए उपयोग किया जाता है?

जावा 3 डी के स्रोत कोड उपयोगिता वर्गों

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

जो Canvas3D के AWTEvents को सुनता भी शामिल है। दो विकल्पों में से एक चुना जा सकता है:

  1. MouseListenerWakeupOnBehaviorPost साथ या
  2. WakeupOnAWTEvent

यह कोड नमूना उपयोगी हो सकता है।

Behavior.processStimulus के भीतर SwingUtilities.invokeLater के माध्यम से एक स्विंग घटक अद्यतन आरंभ करने से कोई समस्या नहीं होनी चाहिए।

+0

वेकअपऑनवाटेवेंट पर संकेत के लिए धन्यवाद। स्रोत कोड को देखते हुए, मैंने एक ही चीज़ को अलग से लागू किया; एपीआई कार्यक्षमता डुप्लिकेट करने के लिए हमेशा अच्छा है। – parasietje

संबंधित मुद्दे