2016-08-01 53 views
1

Ab sofort verwende ich den unten stehenden Code, um zwei Tastendrücke zu erkennen. Das heißt, Strg + F (oder) Shift + 1 ... Etc,So erkennen Sie 3 Tastendrücke in SWT KeyListener

CCombo comboBox = this.cellEditor.getViewer().getCCombo(); 
KeyAdapter keyAdapter = new KeyAdapter() 
{ 
    @Override 
    public void keyPressed(final KeyEvent evt) 
    { 
    // KeyPreferenceUtils is used to get the eclipse workbench key preference values. 
    int keyCode = KeyPreferenceUtils.getKeyValue(); 
    if ((evt.stateMask == SWT.CTRL) || (evt.stateMask == SWT.ALT) || (evt.stateMask == SWT.SHIFT) || (evt.stateMask == SWT.COMMAND)) 
    { 
     String pressedKey = Action.convertAccelerator(evt.stateMask + evt.keyCode); 
     int pressedKeyValue = Action.convertAccelerator(pressedKey); 
     if (pressedKeyValue == keyCode) 
     { 
     comboBox.setListVisible(true); 
     } 
    } 
    else if (evt.keyCode == keyCode) 
    { 
     comboBox.setListVisible(true); 
    } 
    } 
}; 
comboBox.addKeyListener(keyAdapter); 

Nun mein Problem ist, ich 3 Tastendrücke erfassen möchten. Ie, Strg + Shift + 2 oder einige Tastenkombinationen.

Antwort

0

Ich weiß SWT nicht gut, aber ich würde annehmen evt.stateMask ist ein int verwendet, um ein Bit-Feld zu repräsentieren und die SWT.XXX Werte repräsentieren Masken für die entsprechenden Bits. So könnten Sie versuchen if (evt.stateMask & SWT.CTRL > 0 && evt.stateMask & SWT.SHIFT > 0).

evt.stateMask & SWT.CTRL > 0 Um zu klären, würde bedeuten, dass, wenn das von SWT.CTRL definiert Bit in stateMask gesetzt Sie einen Wert größer als 0 sonst Sie 0. Allerdings bekommen erhalten, wenn andere Bits auch gesetzt werden erkennen Sie nicht, dass mit dieser Ansatz.

Wenn Sie nur zulassen möchten, dass diese Bits gesetzt werden, können Sie versuchen if (evt.stateMask == (SWT.CTRL | SWT.SHIFT)) (d. H. Sie kombinieren die beiden Masken und dann vergleichen).

Beispiel:

Wir werden 8-Bit-Werte der Einfachheit halber verwendet werden und SWT.CTRL = 00000001 und SWT.SHIFT = 00000100 nehmen.

Mit dem ersten Ansatz würden Sie für Masken wie 10000101, 00010101, 00000101 und falsch für Masken wie 00100100 usw.

Mit dem zweiten Ansatz wahr erhalten Sie nur wahr für stateMask = 00000101 bekommen würden.

1

Sie wollen oder die Maskencodes

@Override 
public void keyPressed(final KeyEvent evt) 
{ 
// KeyPreferenceUtils is used to get the eclipse workbench key preference values. 
    int keyCode = KeyPreferenceUtils.getKeyValue(); 
    if ((evt.stateMask & (SWT.CTRL | SWT.ALT)) == (SWT.CTRL | SWT.ALT)){ 
     // both ctrl and alt are pressed so do something 
    } 
    else if ((evt.stateMask == SWT.CTRL) || (evt.stateMask == SWT.ALT) || (evt.stateMask == SWT.SHIFT) || (evt.stateMask == SWT.COMMAND)) 
    { 
     // do something else 
    } 
    else if (evt.keyCode == keyCode) 
    { 
     comboBox.setListVisible(true); 
    } 
} 
+0

das obige Verfahren schwer Codes die Taste drücken, um ‚Strg‘/‚Alt‘/‚Shift‘/etc .. Wenn der Benutzer eine beliebige Taste andere tritt als das wird mir diese Logik nicht helfen. Ist es möglich, es generisch zu machen? d. h. für 3 vom Benutzer eingegebene Schlüssel, die geparst werden sollen? –

+0

Sie können immer alle Statusmaskenflags testen und zählen, wie viele gesetzt sind. – BevynQ