2017-02-20 15 views
0

Вот мой код:Как я могу определить CTRL + SHIFT + ANY_KEY с помощью KeyAdapter?

 tabbedPane.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyPressed(java.awt.event.KeyEvent evt) { 

       CheckShortcut controlShortcut = (key) -> { 
        return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK) != 0); 
       }; 

       CheckShortcut controlShiftShortcut = (key) -> { 
        return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK) != 0); 
       }; // Does not work <<<<< 

       if (controlShortcut.f(KeyEvent.VK_N)) { 
        createNewFile(); 
       } else if (controlShortcut.f(KeyEvent.VK_O)) { 
        openFile(); 
       } else if (controlShortcut.f(KeyEvent.VK_S)) { 
        save(); 
       } else if (controlShiftShortcut.f(KeyEvent.VK_S)) { 
        saveAs(); 
       } else if (controlShortcut.f(KeyEvent.VK_Q)) { 
        System.exit(0); 
       } else if (controlShortcut.f(KeyEvent.VK_W)) { 
        MainFrame.toggleFrame(qrWebcamFrame); 
       } else if (controlShortcut.f(KeyEvent.VK_C)) { 
        MainFrame.toggleFrame(comandaCreationFrame); 
       } else if (controlShortcut.f(KeyEvent.VK_P)) { 
        if (accessPasswordFrame("Senha de administrador", 
          "Login: ", "Senha de administrador inválida.", 
          ADMIN_TYPE)) { 
         MainFrame.toggleFrame(passwordFrame); 
        } 
       } 

      } 
     }); 

В controlShortcut работает отлично. Тем не менее, когда я добавляю KeyEvent.SHIFT_MASK к тесту, он не работает. Кроме того, когда я это делаю:

 CheckShortcut controlShiftShortcut = (key) -> { 
      return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK) != 0) && ((evt.getModifiers() & KeyEvent.SHIFT_MASK) != 0); 
     }; 

Это также не работает. Я не понимаю, почему, так как я просто добавляю тот же тест.

+1

Вы должны использовать [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) для чего-то подобного. – camickr

ответ

2

Это не то, как работают побитовые операторы. KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK всегда дает 0, потому что вы И-разные маски.

То, что вы хотите сделать, это создать маску для обоих с помощью OR:

int down = KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK; 
if ((e.getModifiersEx() & down) == down && (e.getKeyCode() == KeyEvent.VK_D)) 
    System.out.println(true); 

Это напечатает

истинного

только тогда, когда Ctrl + сдвиг + D есть p волосы погладила.

Если вы пишете

(e.getModifiersEx() & down) != 0 

он будет проверять, если любой (или оба) из Ctrl или сдвига нажимаются.

Обратите внимание, что вы должны использовать getModifiersEx вместе с X_DOWN_MASK, а не getModifiers, а также X_MASK.

+0

Я включил этот код в качестве предложения «else if», и из-за этого он не работал. Я обнаружил это только сейчас. Большое спасибо за ваш ответ! –

+1

@ EricsonWillians Ну, никто не знает, что такое «CheckShortcut», поэтому мы можем только показать вам, как это делается, а не находить и исправлять ошибку в вашем коде. В будущем предоставьте [mcve]. Пожалуйста. – user1803551

+0

На самом деле это довольно просто. Просто интерфейс: 'interface CheckShortcut {Boolean f (int key); } '. Я должен был распечатать результат теста, чтобы узнать, что он возвращается. По какой-то причине это не работает как предложение else else, связанное с простым тестом 'evt.getModifiers()'. –

0

Вы используете неправильный побитовый оператор на масках.
См JavaDocs

Правильный путь должен быть:

int mask = CTRL_DOWN_MASK | SHIFT_DOWN_MASK; 
if(evt.getModifiersEx() & mask == mask) {doStuff();} 

Смотрите также следующие методы:

evt.isControlDown(); 
evt.isAltDown(); 
evt.isShiftDown(); 
+0

Что-то не так, никто из них не работает, даже с альтернативным вариантом: 'return (evt.getKeyCode() == key) && evt.isControlDown() && evt.isShiftDown();'. 3 ключа одновременно не распознаются. –

+0

@ EricsonWillians Что-то не так - этот ответ. он проверяет либо управление, либо сдвиг. – user1803551

+0

@ user1803551 Пожалуйста, не комментируйте, если вы не знаете, о чем говорите. Из того факта, что даже методы && не работали, это означает, что его логика неверна – stelar7

0

Вы можете просто создать два логических значения для сдвига и управления.

public class DummyClass implements KeyListener{ 
    boolean shift = false, control = false; 

    public void KeyPressed(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_SHIFT) 
     { 
      shift = true; 
     }   
     if(e.getKeyCode() == KeyEvent.VK_CONTROL) 
     { 
      control = true; 
     } 
     if(shift && control) 
     { 
      //Do something 
     } 
     else if(shift) 
     { 
      //Do something 
     } 
     else if(control) 
     { 
      //Do something 
     } 
    } 
    public void KeyReleased(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_SHIFT) 
     { 
      shift = false; 
     }   
     if(e.getKeyCode() == KeyEvent.VK_CONTROL) 
     { 
      control = false; 
     } 
    } 
}