2010-08-25 12 views
5

मुझे यह पता लगाने में सक्षम होना चाहिए कि मेरा एक विशिष्ट संचालन के दौरान एक निश्चित कुंजी (उदा। CTRL) दबाया गया है या नहीं। मेरे पास एक मुख्य श्रोता तक पहुंच नहीं है, न ही माउस ईवेंट के लिए। मैं उम्मीद कर रहा हूं कि कुछ वर्ग होंगे जिनके पास "बूलियन isKeyPressed (कीकोड)" जैसी विधि है।जावा - क्या हम पता लगा सकते हैं कि श्रोता का उपयोग किए बिना एक कुंजी दबाई जाती है?

क्या किसी को इस तरह की विधि के बारे में पता है?

कुछ पृष्ठभूमि के लिए, मैं किसी घटक के लिए डिफ़ॉल्ट ड्रैग & ड्रॉप व्यवहार को ओवरराइड करने का प्रयास कर रहा हूं। डिफ़ॉल्ट रूप से, DropTargetDragEvent के लिए javadocs के अनुसार, यदि कोई कुंजी संशोधक दबाया नहीं जाता है, तो यह एक चाल के लिए घटक की समर्थित क्रिया सूची में दिखता है, फिर एक प्रति & एक लिंक और पहले को ढूंढने के बाद बंद हो जाता है।

मेरे आवेदन में, हम कॉपी & दोनों लिंक का समर्थन करते हैं। Javadoc के अनुसार, CTRL कुंजी दबाए बिना, डिफ़ॉल्ट कार्रवाई प्रतिलिपि है। हम चाहते हैं कि उपयोगकर्ता डिफ़ॉल्ट क्रिया निर्दिष्ट करने में सक्षम हो (उन्हें अपने सबसे अधिक इस्तेमाल किए जाने की अनुमति देता है) और फिर संशोधक कुंजी का उपयोग करके एक विशिष्ट को मजबूर करें।

यदि मैं कुंजी दबाए गए राज्य का पता लगा सकता हूं तो मैं इसे होने के लिए मजबूर कर सकता हूं लेकिन मुझे डिफ़ॉल्ट कार्रवाई को बदलने का कोई अन्य तरीका नहीं दिख रहा है।

अग्रिम धन्यवाद, ब्रायन

+5

आपके पास श्रोता तक पहुंच क्यों नहीं है? क्या आप अपना खुद का निर्माण नहीं कर सकते? आप किस जीयूआई ढांचे का उपयोग कर रहे हैं? –

+0

नोएल - एरिक रॉबर्टसन की पोस्ट के खिलाफ मेरी टिप्पणी प्रतीत होती है। – DaddyB

उत्तर

0

यहां तक ​​कि अगर वहाँ था इस तरह के एक विधि है, क्या आप इसके साथ क्या करना चाहते हैं? आशा है कि यह किसी बिंदु पर सच साबित होने पर एक अंतहीन पाश में कॉल करें? मुझे लगता है कि एक घटना आधारित/श्रोता-आधारित तंत्र इस मामले में काफी बेहतर है।

+1

एक अंतहीन पाश नहीं, नहीं। बस एक निश्चित ऑपरेशन के दौरान मांग पर बुलाया (ड्रैग और ड्रॉप के दौरान कॉलबैक)। – DaddyB

5

MouseEvent.getModifiers() विधि MouseEvent उत्पन्न होने पर दबाए गए संशोधक कुंजी का बिटमैप वापस कर देगा। या, आप विशेष रूप से CTRL कुंजी जांचने के लिए MouseEvent.isControlDown() का उपयोग कर सकते हैं।

+0

मैं मानता हूं कि एक आदर्श दुनिया में, एक प्रमुख श्रोता शायद सबसे अच्छा होगा। हालांकि, मेरी राय में, मेरे परिदृश्य के लिए इस दृष्टिकोण के साथ कुछ समस्याएं हैं: मैं श्रोता को क्या जोड़ूं? मेरा आवेदन UI के संदर्भ में बहुत जटिल है और प्लगइन के माध्यम से भी अनुकूलन योग्य है। मैंने ईवेंट थ्रेड में श्रोता को जोड़ने पर देखा है, लेकिन यह सभी महत्वपूर्ण घटनाओं को संसाधित करता है और इसलिए कहीं और प्रदर्शन प्रभाव हो सकते हैं। इसी प्रकार, एप्लिकेशन की विस्तारशीलता का अर्थ है कि मेरे पास ड्रैग की शुरुआत का पता लगाने का कोई तरीका नहीं है और इसलिए मैं श्रोता को – DaddyB

+0

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

+0

मैंने अपनी प्रतिक्रिया अपडेट की - आप हर बार जब माउस ले जाया जाता है या खींच लिया जाता है तो आप माउसइवेंट उत्पन्न कर सकते हैं। –

0

मुझे लगता है कि आप इस गलत तरीके से जा रहे हैं। आप जो करना चाहते हैं वह ड्रैग शुरू होने पर कार्रवाई को बदलना है, जब इसे गिराया नहीं जाता है। "कोई संशोधक" मामले में उपयोगकर्ता वरीयताओं से पूछताछ सहित, कार्रवाई को शुरू करने के तरीके को बदलने के तरीके हैं। यह संभव है कि DropTargetDragEvent को कॉल करने के तरीके को बदलना।

+0

मैं सहमत हूं - लेकिन मैं कोड में "कोई संशोधक" केस सेट करने के तरीके को काम करने में सक्षम नहीं हूं - javadocs (मेरी मूल पोस्ट में लिंक देखें) इंगित करता है कि प्रतिलिपि लिंक पर प्राथमिकता लेती है। अगर आपको यह करने के बारे में कोई सुझाव मिल गया है तो यह बहुत सराहना की जाएगी। – DaddyB

1

यह इसके बारे में जाने का संभवतः गंदा तरीका है। लेकिन यह आपको महत्वपूर्ण घटनाओं को 'रिकॉर्ड' करने की अनुमति देता है और फिर उनसे पूछताछ करता है।

//register this somewhere in the startup of your application 
KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
    mgr.addKeyEventDispatcher(KeyEventRecorder.getInstance()); 

//then can query events later 
    KeyEvent keyEvt = KeyEventRecorder.getLastEvent(); 
    if(keyEvt != null && keyEvt.getKeyCode() == KeyEvent.VK_CONTROL && keyEvt.getID() == KeyEvent.KEY_PRESSED) 
     //do something.. 

    private class KeyEventRecorder implements KeyEventDispatcher 
    { 
     private static KeyEvent lastEvent; 
     private static KeyEventRecorder myInstance; 

     private KeyEventRecorder() 
     { 
      super(); 
     } 

     public static synchronized KeyEventRecorder getInstance() 
     { 
      if(myInstance == null) 
       myInstance = new KeyEventRecorder(); 
      return myInstance; 
     } 

     /** 
     * retrieve the last KeyEvent dispatched to this KeyEventDispatcher 
     */ 
     public static KeyEvent getLastEvent() 
     { 
      return lastEvent; 
     }//method 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) 
     { 
      lastEvent = e; 
      //return false to let KeyboardFocusManager redistribute the event elsewhere 
      return false; 
     }//method 
    }//class 
संबंधित मुद्दे