2009-04-30 8 views
7

मुझे स्विंग में किसी घटक को कुछ ईवेंट भेजने की आवश्यकता है, इसलिए इसे किसी भी उपयोगकर्ता द्वारा उत्पन्न, मानक स्विंग ईवेंट की तरह ही संभाला जाता है।स्विंग: ईवेंट कैसे बनाएं और उन्हें किसी घटक को प्रेषित करें?

मूल रूप से, मैक्रो रिकॉर्डर की तरह कुछ और फिर जेडिटरपेन के लिए निष्पादक। लेकिन मुझे जेनरेट की गई घटनाओं पर अधिक नियंत्रण की आवश्यकता है।

अतः, मान मैं एक संपादक है, मैं चाहता हूँ:

  1. कब्जा सभी घटनाओं इसे करने के लिए भेजा है, और उस बिंदु पर, मैं उन्हें सूची में, ..
  2. स्टोर कर सकते हैं डिस्क, या whatver पर
  3. बाद में उन घटनाओं को चलाने में सक्षम हो
  4. आदर्श स्थिति, उपयोगकर्ता को ऐसे आदेशों को संपादित करने की अनुमति देना है जिनमें
    "टाइप कुंजी ए, चयन लाइन, हटाएं-चयन, कर्सर-अप, लाइन-स्टार्ट .. "
+0

आपका प्रश्न स्पष्ट नहीं है। –

उत्तर

3

यदि आप मानक जीयूआई घटनाओं की तलाश में हैं, तो आप java.awt.Robot

यदि आप अपनी खुद की घटनाओं को परिभाषित करना चाहते हैं, तो आपको उन घटनाओं को प्राप्त करने के लिए जीयूआई कक्षाओं को उपclass करना होगा (या बेहतर, उनके लिए एक बाहरी नियंत्रक बनाएँ), एक घटना वर्ग परिभाषित करें, और घटनाओं को प्रेषित करें। प्रेषण के लिए आप java.beans.EventHandler का उपयोग कर सकते हैं, अपने स्वयं के हैंडलर क्लास (मुझे अवसरों पर अधिक उपयोगी पाया गया है) बनाएं, या सिस्टम इवेंट कतार में अपनी घटनाओं (वे कैसे प्राप्त करते हैं) पर इंजेक्ट करें (कक्षा को ऐसा करने के लिए नहीं मिल सकता ... मैंने सोचा कि यह टूलकिट था)।

हालांकि, मैं इनमें से कोई भी नहीं करूँगा। आप जो वर्णन करते हैं (एक मैक्रो रिकॉर्डर) को एक नियंत्रक का उपयोग करके कार्यान्वित किया जाना चाहिए जो अनुप्रयोग-विशिष्ट क्रिया संदेशों की श्रृंखला को खिलाया/खिलाया जाता है (कमांड पैटर्न देखें)।

+0

मुझे आपके आदेशों की नोक पसंद है। लेकिन वास्तव में इसे कैसे करना है इस पर कुछ भी नहीं मिला। – Ayman

+0

यह जानने के बिना कि आप क्या करना चाहते हैं, कंक्रीट सलाह देना मुश्किल है। हालांकि, मान लें कि एक जेडडिटर अपनी सामग्री को प्रबंधित करने के लिए javax.swing.text.Document का उपयोग करता है, और आप इस दस्तावेज़ में सभी परिवर्तन प्राप्त करने के लिए दस्तावेज़ लिस्टनर संलग्न कर सकते हैं। यदि आप उस श्रोता की घटनाओं को किसी सूची में सहेजते हैं, तो आप किसी भी समय उस सूची को फिर से चला सकते हैं और परिवर्तन लागू कर सकते हैं - या उन्हें पूर्ववत करें। – kdgregory

+0

अब कम से कम, मुझे एक संपादक पर मैक्रोज़ रिकॉर्डिंग और रीप्ले करने का एक सरल लेकिन प्रोग्राम करने योग्य तरीका चाहिए। दस्तावेज़ से जुड़ने में समस्या यह है कि कैरेट आंदोलन दस्तावेज़ को नहीं भेजा जाएगा। तो मुझे जीयूआई घटक द्वारा प्राप्त/संसाधित घटनाओं पर हुकअप करने की आवश्यकता होगी।क्रियाएं एक महान फिट की तरह लगती हैं, bu मुझे भेजे गए कार्यों (रिकॉर्ड करने के लिए) और फिर रिकॉर्ड किए गए/संसाधित क्रियाओं को घटक पर इंजेक्शन देने का एक तरीका चाहिए। मैनी धन्यवाद। – Ayman

2

मेरा मानना ​​है कि आप ईवेंट की घटना का निर्माण करने के लिए और फिर फोन

java.awt.EventQueue.dispatchEvent(event) 

वांछित घटक को घटना के स्रोत सेट है।

+1

EventQueue.dispatchEvent एक संरक्षित उदाहरण विधि है। आपको वर्तमान ईवेंट कतार प्राप्त करना होगा और उस विधि का उपयोग करने के लिए उप-वर्ग को धक्का देना होगा। –

+0

इसके बजाय postEvent() के बारे में कैसे? –

+0

ओह। हां, postEvent() सही उत्तर की तरह दिखता है। –

6

करने के लिए स्पष्ट बात यह है कि EventQueue प्राप्त करें और इसमें ईवेंट पोस्ट करें। यह केवल कतार में घटना को जोड़ देगा जो ईडीटी पर अपनी बारी में प्रेषित होगा।

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event); 

किसी ने कल दावा किया ओपेरा और सफारी अपने स्वयं के काम करते हैं और अविश्वस्त कोड के लिए आवश्यक अनुमति नहीं देते हैं।

ऐसा करने का एक सीधा तरीका Component.dispatchEvent पर कॉल करना है।

+0

मैं कोड का पता लगा रहा हूं जो 'Component.dispatchEvent' का उपयोग करता है और यदि मैं गलत नहीं कर रहा हूं, तो यह वास्तव में वर्तमान धागे पर श्रोता को बुलाएगा? 'PostEvent' विधि बेहतर नहीं है क्योंकि यह ईवेंट क्यूई थ्रेड पर हैंडलर का आह्वान करेगा? – Jeach

+0

आपको ईडीटी पर घटकों के साथ बहुत कुछ करना चाहिए। (एडब्ल्यूटी का दावा है कि सभी थ्रेड-सुरक्षित हैं, लेकिन नहीं है।) और निश्चित रूप से, जैसा कि मैंने उल्लेख किया है, अनुमतियां हैं। –

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