Ho un JFrame con un numero elevato di componenti figlio modificabili. (Molti livelli) C'è un modo per aggiungere un listener per tutti gli eventi del mouse? Qualcosa come KeyEventDispatcher?Come posso catturare tutti gli eventi del mouse in un JFrame/Swing?
risposta
Utilizzare un AWTEventListener per filtrare le MouseEvents:
long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK;
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
{
public void eventDispatched(AWTEvent e)
{
System.out.println(e);
}
}, eventMask);
Questo non è consentito nelle applet non firmate – lexicalscope
Attuare tutti gli ascoltatori di topo legati in una classe, e registrare quella classe come il gestore per tutti gli eventi correlati del mouse interfacce
mouse Correlati sarebbero
MouseListener MouseMotionListener MouseWheelListener
Ciò non funziona poiché solo un singolo componente nella gerarchia pubblica l'evento del mouse. Quindi ciò richiederebbe la registrazione del listener di mouse su ogni componente nella gerarchia. –
Hai per usare JFrame's glassPane: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFrame.html#getGlassPane()
Basta prendere il vetro di un JFrame con frm.getGlassPane() e utilizzare addMouseListener() su di esso per catturare tutti gli eventi del mouse all'interno della finestra.
È possibile implementare una sottoclasse di MouseAdapter
, una classe astratta che fornisce le implementazioni vuote di tutti i metodi definiti nelle interfacce Mouse*Listener
. Una volta che lo fai, puoi registrarlo con i componenti figlio come MouseListener
quando vengono creati. Mentre indicherai che i tuoi componenti stanno "cambiando", vorrai assicurarti di annullare la registrazione del listener anche se speri di rilasciare i componenti durante il ciclo di vita di JFrame.
si potrebbe aggiungere un GlassPane su tutto il JFrame, aggiungere un MouseInputAdapter ad esso per afferrare tutti i possibili eventi del mouse, e quindi usare [SwingUtilities.getDeepestComponentAt()] [3] per ottenere il componente effettivo e [SwingUtilities.convertMouseEvent ()] [4] per delegare l'evento del mouse dal riquadro di vetro al componente reale.
Tuttavia, non sono sicuro del l'impatto sulle prestazioni di questo - a differenza KeyEventDispatcher, che ha solo bisogno di generare un evento ogni volta che si preme un tasto, più eventi vengono generati quando l'utente sposta il mouse - e, a differenza KeyEventDispatcher, è è necessario inviare nuovamente l'evento al componente inferiore per gestirlo.
(Sorry - StackOverflow non gestisce i collegamenti ai metodi SwingUtilities correttamente ... i collegamenti stanno mostrando di seguito, piuttosto che nel testo.)
[3]: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#getDeepestComponentAt(java.awt.Component, int, int) [4 ]: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#convertMouseEvent(java.awt.Component, java.awt.event.MouseEvent, java.awt.Component)
perché è questo wiki comunità? – akf