2011-04-30 10 views
10

मैंने एक एसडब्ल्यूटी यूआई लिखा है जिसमें स्टाइलटेक्स्ट नियंत्रण में टेक्स्ट प्रदर्शित करने का प्राथमिक कार्य है। मैं Ctrl + एफ के लिए एक हैंडलर जोड़ना चाहता हूं ताकि जब उस शॉर्टकट दबाया जाता है तो फोकस एक खोज बॉक्स पर सेट होता है। मैंने कुंजीपटल का पता लगाने के लिए निम्न कोड का उपयोग करने का प्रयास किया है।मेरे एसडब्ल्यूटी एप्लिकेशन में ctrl-f का पता लगाने के लिए कैसे करें

sWindow = new Shell(); 
... 
sWindow.getDisplay().addFilter(SWT.KeyDown, new Listener() 
{ 
    @Override 
    public void handleEvent(Event e) 
    { 
    System.out.println("Filter-ctrl: " + SWT.CTRL); 
    System.out.println("Filter-mask: " + e.stateMask); 
    System.out.println("Filter-char: " + e.character); 
    } 
}); 

मैं उम्मीद कर रहा था कि जब मैं Ctrl +दबाया च मैं निम्नलिखित उत्पादन देखना होगा:

Filter-ctrl: 262144 
Filter-mask: 262144 
Filter-char: f 

हालाँकि, व्यवहार में मैं वास्तव में निम्नलिखित देखते हैं।

Filter-ctrl: 262144 
Filter-mask: 262144 
Filter-char: <unprintable char - displayed as a box in eclipse console> 

मैं दो प्रश्न हैं:

  • है Display.addFilter (...) एक वैश्विक शॉर्टकट जोड़ने के लिए सबसे अच्छा तरीका है? मैंने Display.addListener (...) की कोशिश की लेकिन इसे कोई भी घटना नहीं मिली।
  • जब मैं Ctrl दबा रहा हूं तो मुझे दबाए गए चरित्र क्यों नहीं मिलते हैं? जब मैं Alt या shift दबाता हूं तो मुझे अपेक्षित मुखौटा और दबाया गया चरित्र मिलता है।

उत्तर

31

Is Display.addFilter(...) the best way to add a glbal shortcut? I tried Display.addListener(...) but this didn't receive any events at all.

हाँ, सामान्य रूप से Display.addFilter(...) का सबसे अच्छा तरीका एक glbal शॉर्टकट जोड़ने के लिए है क्योंकि वे घटना श्रोताओं साथ-साथ उसका प्राथमिकता है है। Display.addFilter(...) javadoc से नीचे दी गई टिप्पणी देखें।

क्योंकि अन्य श्रोताओं से पहले चलाने घटना फिल्टर, घटना फिल्टर कर सकते हैं दोनों ब्लॉक अन्य श्रोताओं और एक घटना के भीतर मनमाना क्षेत्रों की स्थापना की। इस कारण से, ईवेंट फ़िल्टर शक्तिशाली और खतरनाक दोनों हैं। उन्हें को आम तौर पर प्रदर्शन के लिए टालना चाहिए, डीबगिंग और कोड रखरखाव कारणों से।


अपने दूसरे प्रश्न के लिए:

Why don't I get the pressed character when I'm holding down ctrl? When I hold down alt or shift I get the expected mask and the pressed character.

समस्या यह है कि आप गलत जगह पर देख रहे हैं है। e.character से पूछताछ के बजाय आपको e.keyCode का उपयोग करना चाहिए। प्रति e.character की जावाडोक के रूप में आप सिर्फ चरित्र f नहीं मिलेगा:

घटना, चरित्र महत्वपूर्ण यह है कि आपके द्वारा लिखा गया था द्वारा प्रतिनिधित्व के आधार पर। यह अंतिम वर्ण है कि सभी संशोधक के बाद परिणाम लागू किए गए हैं।उदाहरण के लिए, जब उपयोगकर्ता प्रकार Ctrl + A टाइप करते हैं, तो वर्ण मान 0x01 (ASCII SOH) है।

तो तुम जब प्रेस CTRL + तो यह 0x06 (ASCII एसीके) में बदल देता है। कौन सा मामला है जब आप एएलटी + करना चयाशिफ्ट + नहीं है।

दूसरी ओर e.keyCode की जावाडोक कहते हैं पर:

घटना, कुंजी कोड महत्वपूर्ण यह है कि आपके द्वारा लिखा गया था की के आधार पर, वर्ग SWT में महत्वपूर्ण कोड स्थिरांक द्वारा परिभाषित के रूप में। जब ईवेंट का वर्ण फ़ील्ड संदिग्ध है, तो यह फ़ील्ड में मूल वर्ण का अप्रभावित मान शामिल है। उदाहरण के लिए, टाइपिंग Ctrl + M या दोनों अक्षर दर्ज करें 'r' 'लेकिन keyCode फ़ील्ड में' \ r 'भी होगा, जब एंटर टाइप किया गया था और' एम 'जब Ctrl + M टाइप किया गया था।

अधिक जानकारी के लिए नीचे दिए गए कोड को देखें। डेमो के लिए मैंने श्रोता को Display और Test पर डालने का प्रयास किया है।

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.KeyEvent; 
import org.eclipse.swt.events.KeyListener; 
import org.eclipse.swt.graphics.Color; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 

public class ControlF 
{ 
    public static void main(String[] args) 
    { 

     Display display = new Display(); 

     final Shell shell = new Shell (display); 
     final Color green = display.getSystemColor (SWT.COLOR_GREEN); 
     final Color orig = shell.getBackground(); 

     display.addFilter(SWT.KeyDown, new Listener() { 

      public void handleEvent(Event e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        System.out.println("From Display I am the Key down !!" + e.keyCode); 
       } 
      } 
     }); 

     shell.addKeyListener(new KeyListener() { 
      public void keyReleased(KeyEvent e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        shell.setBackground(orig); 
        System.out.println("Key up !!"); 
       } 
      } 
      public void keyPressed(KeyEvent e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        shell.setBackground(green); 
        System.out.println("Key down !!"); 
       } 
      } 
     }); 

     shell.setSize (200, 200); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 

    } 
} 
+0

यह एक उत्कृष्ट उत्तर था - अब मुझे अपना शॉर्टकट काम मिल गया है। धन्यवाद! मैं अगली बार दस्तावेज़ों को बेहतर ढंग से पढ़ने की कोशिश करूंगा! – mchr

+0

जिसने मेरी समस्या भी हल की, स्पष्ट स्पष्टीकरण के लिए धन्यवाद! +1 –

+0

हम इस तरह के फ़िल्टर को जोड़कर ctrl + c जैसे सिस्टम शॉर्टकट को ओवरराइड कैसे कर सकते हैं? – Fahad

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

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