2013-03-06 4 views
12

Dlaczego MouseEvents w Java modyfikatory akcji między klawiszami i przyciskami myszy?Dlaczego wszystkie kliknięcia środkowe w Javie są zgłaszane jako posiadające modyfikator Alt?

Rozważmy prosty kod poniżej:

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setSize(800,600); 
    frame.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      System.out.println(e); 
     } 
    }); 
    frame.setVisible(true); 
} 

Jeśli klikniesz trzy razy w jednym oknie (lewym przyciskiem myszy, kliknij jeden środkowy i jeden prawy klik) zobaczysz następujący wynik.

java.awt.event.MouseEvent[MOUSE_CLICKED,(165,149),absolute(165,149),button=1,modifiers=Button1,clickCount=1] on frame0 
java.awt.event.MouseEvent[MOUSE_CLICKED,(292,228),absolute(292,228),button=2,modifiers=Alt+Button2,clickCount=1] on frame0 
java.awt.event.MouseEvent[MOUSE_CLICKED,(293,228),absolute(293,228),button=3,modifiers=Meta+Button3,clickCount=1] on frame0 

Jeśli przyjrzysz, zauważysz, że wszystkie środkowe kliknięcia są zgłoszone jako posiadające klawisz alt dół, a wszyscy prawego kliknięcia są zgłoszone jako posiadające Meta klucz w dół. Jest to dobrze udokumentowane, a nawet w Javadocs dla MouseEvent jest nawet wiersz z informacją o tym nakładaniu. Ale moje pytanie brzmi: dlaczego tak się mówi? Co to jest powód powrotu true z e.isAltDown() dla środkowego kliknięcia?

To sprawia, że ​​trudno jest odróżnić Alt + Button1 i Button2 na niektórych platformach.

Czy istnieją również przewodniki "Best Practices" do projektowania międzyplatformowych zachowań myszy w Javie?

+1

Mac. Lub inne systemy, które mogą używać myszy jednoprzyciskowych. – GSP

Odpowiedz

7

Uważam, że ponowne użycie flag jest z przyczyn historycznych. Mogę tylko zgadywać o oryginalnych motywacjach, ale jeden mógł nie używać zbyt wielu bitów, aby więcej bitów pozostało dostępnych dla przyszłych rozszerzeń. Innym powodem może być fakt, że Mac miał tylko jedną mysz, więc modyfikatory były (i wciąż są) powszechnie używane na Macach do oznaczania rzeczy, z których zwykle używa się innego przycisku myszy w systemach o wystarczającej liczbie takich.

Od wersji Java 1.4 wolałbym używać getModifiersEx, który zgłosi te modyfikatory i przyciski osobno. Tak więc informacje są dostępne, po prostu nie są zgłaszane przez stary interfejs w celu zachowania kompatybilności wstecznej.

+0

Miałem nadzieję, że dowiem się trochę więcej o wymaganiach projektowych, które znalazły się w oryginalnych motywacjach. – JohnnyO

Powiązane problemy