2009-09-03 14 views
5

Czy istnieje sposób, w Javie, aby bezpośrednio sprawdzić, czy jeden z przycisków myszy jest wyłączony bez korzystania z wydarzeń, słuchaczy itp.? Chciałbym mieć wątek, który, co 100 milisekund, sprawdza czy przycisk myszy jest wyłączony, a następnie robi coś. Więc jeśli użytkownik przytrzyma przycisk myszy przez jakiś czas, wywoła kilka odpowiedzi.Naciśnięcie myszy Java - bez zdarzeń

Więc szukam metody, która daje stan myszy, bez przechodzenia przez zwykły system obsługi zdarzeń.

dzięki

+4

Przepraszam, ale ... dlaczego? –

Odpowiedz

4

Uważam, że nie jest to możliwe w Javie. Cóż, jest to możliwe dzięki JNI, ale jest to świat bólu.

Robienie tego z wydarzeniami nie jest trudne, a integracja z resztą aplikacji będzie lepsza. Oto przykład pisać do konsoli co 100 ms, podczas gdy przycisk myszy jest wciśnięty:

import javax.swing.*; 
import java.awt.event.*; 

public class Test { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     final JLabel label = new JLabel("Click on me and hold the mouse button down"); 
     label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.getContentPane().add(label); 
     label.addMouseListener(new TimingMouseAdapter()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static class TimingMouseAdapter extends MouseAdapter { 
     private Timer timer; 

     public void mousePressed(MouseEvent e) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Mouse still pressed..."); 
       } 
      }); 
      timer.start(); 
     } 

     public void mouseReleased(MouseEvent e) { 
      if (timer != null) { 
       timer.stop(); 
      } 
     } 

    } 
} 

Modyfikacja tego robić różne rzeczy (takich jak zmiana trybu pędzla) po różnych okresach czasu powinna być prosta.

+0

Wow, dzięki. Spróbuję wtedy użyć timerów. –

4

nie wiem czy jest to możliwe - może to jest.

Jednak zawsze można napisać procedurę obsługi zdarzeń, której jedynym zadaniem jest śledzenie bieżącego stanu myszy. Wtedy twój kod 100ms mógłby po prostu zapytać.

+0

Pomyślałem o tym, ale jest to trochę bardziej skomplikowane. Pomyślałem, że spróbuję sprawdzić, czy ktoś zna metodę, aby bezpośrednio uzyskać stan myszy, a jeśli nie, użyj funkcji obsługi zdarzenia. –

2

Niezależnie od tego, czy jest to możliwe, czy na pewno chcesz to zrobić?

Wydaje mi się, że prawdopodobnie nie trafisz kliknięć w ten sposób. 100 milisekund to jedna dziesiąta sekundy. Wiele kliknięć nie trwa tak długo.

Nawet jeśli zmniejszysz pętlę odpytywania, wszystko, co robisz, to zawęzić okno, w którym możesz pominąć kliknięcie, więc rzadziej będzie brakować kliknięć. Ale nadal będzie to stan wyścigu.

Zgaduję, że twoja troska o komplikacje wynika z konieczności radzenia sobie z problemami z wątkami, ale jeśli nie dostarczysz nam więcej informacji, nie możemy ci bardzo pomóc.

+0

100 milis było tuż nad moją głową, planowałem eksperymentować z różnymi czasami. Dobry punkt o brakujących kliknięciach. Próbuję sprawić, aby mysz działała jak narzędzie do rysowania pędzlem dla programu graficznego, co wymagałoby reakcji programu w zależności od czasu naciśnięcia myszy. Chcę się dowiedzieć, czy możliwe jest wykonanie tego rodzaju niskiego poziomu, bezpośredniego zapytania o stan myszy, a następnie eksperymentuję, zobaczę, jak to działa i skorzystam z niego lub spróbuję użyć funkcji obsługi zdarzeń zamiast. –

+0

Do programu do rysowania użyłem MouseMotionListener i zaimplementowałem mouseDragged(), aby umożliwić rysowanie. –

0

Powinno być dość łatwe pisanie słuchacza, aby mógł obsłużyć stan myszy. Zobacz Global Event Listeners, aby uzyskać wprowadzenie do narzędzia AWTEventListener, które umożliwia odsłuchiwanie wszystkich zdarzeń myszy za pomocą pojedynczego detektora.

Następnie w słuchaczu uruchomi się programator.

Powiązane problemy