2013-03-06 7 views
12

Perché i mouseEvents in Java condividono modificatori tra i tasti e i pulsanti del mouse?Perché tutti i clic intermedi in Java sono segnalati come aventi il ​​modificatore Alt?

Si consideri, il semplice codice qui sotto:

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); 
} 

Se si fa clic su tre volte nella finestra (un clic sinistro, un tasto centrale, e uno destro del mouse) si vedrà il seguente output.

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 

Se si guarda, si noterà che tutti i clic intermedi sono riportati come avere il tasto Alt, e tutti i clic destro sono riportati come avere il tasto Meta verso il basso. Questo è ben documentato, e c'è anche una riga in Javadocs per MouseEvent che menziona questa sovrapposizione. Ma la mia domanda è: perché è riportato in questo modo? Qual è il ragionamento alla base della restituzione di true da e.isAltDown() per un clic intermedio?

Ciò rende difficile distinguere tra Alt + Button1 e Button2 su alcune piattaforme.

Analogamente, esistono guide "Best Practices" per la progettazione di comportamenti di mouse multipiattaforma in Java?

+1

Mac. O altri sistemi che potrebbero utilizzare mouse a un solo pulsante. – GSP

risposta

7

Credo che questo riutilizzo di bandiere sia per ragioni storiche. Posso solo indovinare le motivazioni originali, ma uno potrebbe non aver usato troppi bit in modo che restino disponibili più bit per le estensioni future. Un altro potrebbe essere stato il fatto che Mac avesse un solo mouse, quindi i modificatori erano (e sono tuttora) comunemente usati su Mac per indicare cose per le quali si userebbe normalmente un pulsante del mouse diverso su sistemi con un numero sufficiente di questi.

Da Java 1.4 preferisco usare getModifiersEx che riporterà questi modificatori e pulsanti separatamente. Quindi l'informazione è disponibile, semplicemente non viene riportata attraverso la vecchia interfaccia al fine di mantenere la retrocompatibilità.

+0

Speravo di imparare un po 'di più sui requisiti di progettazione che andavano nelle motivazioni originali. – JohnnyO

Problemi correlati