2010-08-25 13 views
5

Muszę być w stanie wykryć, czy określony klawisz (np. CTRL) jest naciśnięty podczas określonej operacji. Nie mam dostępu do kluczowego odbiornika ani do zdarzenia myszy. Mam nadzieję, że będzie jakaś klasa, która ma metodę taką jak "boolean isKeyPressed (keycode)".Java - Czy możemy wykryć, czy naciśnięty jest klawisz bez użycia odbiornika?

Czy ktoś świadomy takiej metody w java?

Dla odrobiny tła, próbuję przesłonić domyślne zachowanie przeciągnięcia dla komponentu. Domyślnie, zgodnie z javadocs dla DropTargetDragEvent, jeśli nie zostanie naciśnięty żaden modyfikator klawiszy, to szuka na liście obsługiwanych działań komponentu dla ruchu, a następnie kopii &, a następnie łącza i zatrzymuje się po znalezieniu pierwszego.

W mojej aplikacji obsługujemy obie kopie &. Jak na javadoc, bez wciśniętego klawisza CTRL, domyślną akcją jest kopia. Chcemy, aby użytkownik mógł określić domyślną akcję (pozwalając im ustawić najczęściej używane), a następnie wymusić określoną za pomocą klawiszy modyfikujących.

Jeśli mogę wykryć naciśnięty klawisz, mogę to wymusić, ale nie widzę innego sposobu zmiany domyślnej akcji.

góry dzięki Brian

+5

Dlaczego nie masz dostępu do słuchacza? Nie możesz stworzyć własnego? Z jakiego interfejsu GUI korzystasz? –

+0

Noel - wydaje mi się komentarz do postu Erick Robertson. – DaddyB

Odpowiedz

0

Nawet jeśli istnieje taka metoda, co chcesz z tym zrobić? Nazwij to nieskończoną pętlą w nadziei, że w pewnym momencie powróci ona do prawdy? Myślę, że mechanizm oparty na zdarzeniach/słuchaczach pasuje w tym przypadku znacznie lepiej.

+1

nie jest nieskończoną pętlą, nie. po prostu wywoływana na żądanie podczas określonej operacji (oddzwanianie podczas przeciągania i upuszczania). – DaddyB

5

Metoda zwraca bitmapę klawiszy modyfikujących, które są naciśnięte w momencie wygenerowania MouseEvent. Lub możesz użyć MouseEvent.isControlDown(), aby sprawdzić konkretnie klawisz CTRL.

+0

Zgadzam się, że w idealnym świecie kluczowy słuchacz byłby prawdopodobnie najlepszy. jednak, moim zdaniem, istnieją pewne problemy z tym podejściem dla mojego scenariusza: Do czego mam dołączać słuchacza? moja aplikacja jest dość złożona pod względem interfejsu użytkownika i można ją również dostosować za pomocą wtyczek. Przyjrzałem się dołączaniu odbiornika do wątku zdarzenia, ale to kończy przetwarzanie wszystkich kluczowych zdarzeń i może mieć wpływ na wydajność w innym miejscu. Podobnie, rozszerzalność aplikacji oznacza, że ​​niekoniecznie mam sposób na wykrycie początku przeciągania i dlatego nie mogę selektywnie włączyć słuchacza w – DaddyB

+0

Właśnie grałem z kluczowym słuchaczem i Okazuje się, że kluczowe zdarzenia nie są uruchamiane, gdy przycisk myszy jest wciśnięty (i pracuję tutaj z metodą przeciągnij i upuść), co wyklucza kluczowego słuchacza. Sądzę, że mógłbym spojrzeć na globalnego słuchacza myszy i sprawdzić stan modyfikatorów, ale to wydaje się przesadą dla tego problemu. – DaddyB

+0

Zaktualizowałem moją odpowiedź - możesz sprawdzić, czy MouseEvent jest generowany za każdym razem, gdy mysz jest przenoszona lub przeciągana. –

0

Myślę, że robisz to źle. To, co chcesz zrobić, to zmienić akcję po rozpoczęciu przeciągania, a nie po upuszczeniu. Istnieją sposoby na zmianę działania inicjacji, w tym na zbadanie preferencji użytkownika w przypadku "braku modyfikatorów". Możliwe, że zmieni się sposób wywoływania DropTargetDragEvent.

+0

Zgadzam się - ale nie byłem w stanie ustalić, jak ustawić kod błędu "no modifiers" w kodzie - javadocs (patrz link w moim oryginalnym wpisie) wskazują, że kopia ma pierwszeństwo przed linkiem. Jeśli masz jakieś sugestie, jak to zrobić, to byłoby to bardzo cenne. – DaddyB

1

To jest prawdopodobnie brudny sposób, aby o tym poradzić. Ale to pozwala ci "nagrywać" kluczowe zdarzenia, a następnie je sprawdzać.

//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 
Powiązane problemy