Necesito ayuda para comprender la propagación de eventos en Swing. Sé que cada evento es manejado por un solo componente. Por lo tanto, cuando tengo un panel outside
con un panel secundario inside
y agrego mouseListeners a ambos, se llamará al de inside
. Eso es lindo y ese es el comportamiento esperado.MouseMotionListener en el componente secundario desactiva MouseListener en el componente principal
Pero no entiendo el comportamiento en la siguiente situación: inside
registra un MouseMotionListener y outside
registra un MouseListener. Espero que inside
consuma todos MouseMotionEvents y outside
para recibir MouseEvents, porque no hay ningún detector para MouseEvents normal en inside
. Pero ese no es el caso, inside
de alguna manera consume todos los eventos MouseEvents, no solo MouseMotionEvents.
El código siguiente ilustra el problema:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventTest {
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
JComponent inside = new JPanel();
inside.setBackground(Color.red);
inside.setPreferredSize(new Dimension(200,200));
MouseMotionListener mm = new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent arg0) {
System.err.println("dragged");
}
@Override
public void mouseMoved(MouseEvent arg0) {
System.err.println("moved");
}
};
// next line disables handling of mouse clicked events in outside
inside.addMouseMotionListener(mm);
JComponent outside = new JPanel();
outside.add(inside);
outside.setPreferredSize(new Dimension(300,300));
outside.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
System.err.println("clicked");
}
});
JFrame frame = new JFrame();
frame.add(outside);
frame.pack();
frame.setVisible(true);
}
});
}
}
pude solucionar el problema mediante el registro de un oyentes en inside
para todos los eventos del componente padre podría estar interesado en y después de llamar dispatchEvent remitir el caso a la padre.
a) ¿alguien me puede indicar algunos documentos, donde se describe este comportamiento? Los javadocs de MouseEvent me hicieron pensar que mis expectativas eran correctas. Entonces, necesito una descripción diferente para entenderlo.
b) ¿hay alguna solución mejor que la que se ha descrito anteriormente?
Gracias, Kathrin
Editar: Todavía no está claro, ¿por qué oscilación se comporta de esta manera. Pero a medida que se ve, la única forma de hacer que las cosas funcionen es reenviar manualmente los eventos, lo haré.
+1 para [sscce] (http://sscce.org/). – trashgod