Ich brauche Hilfe, um die Ereignisausbreitung in Swing zu verstehen. Ich weiß, dass jedes Ereignis nur von einer Komponente gehandhabt wird. Wenn ich also ein Panel outside
mit einem untergeordneten Panel inside
habe und ich mouseListeners zu beiden hinzufüge, wird das von inside
aufgerufen. Das ist nett und das ist das erwartete Verhalten.MouseMotionListener in untergeordneten Komponente deaktiviert MouseListener in übergeordnete Komponente
Aber ich verstehe das Verhalten in der folgenden Situation nicht: inside
registriert einen MouseMotionListener und outside
registriert einen MouseListener. Ich erwarte inside
, um alle MouseMotionEvents und outside
zu empfangen, um die MouseEvents zu empfangen, da für normale MouseEvents auf inside
kein Listener ist. Aber das ist nicht der Fall, inside
verbraucht irgendwie alle MouseEvents und nicht nur die MouseMotionEvents.
Der folgende Code zeigt das Problem:
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);
}
});
}
}
ich durch die Registrierung ein Zuhörer auf inside
für alle Veranstaltungen der Elternkomponente interessieren könnten und dann rufen dispatch das Problem umgehen, könnte das Ereignis an die zu übermitteln Elternteil.
a) Kann mich jemand auf einige Dokumente verweisen, in denen dieses Verhalten beschrieben wird? Die Javadocs von MouseEvent ließen mich denken, dass meine Erwartungen richtig waren. Also brauche ich eine andere Beschreibung, um es zu verstehen.
b) Gibt es eine bessere Lösung als die oben skizzierte?
Danke, Kathrin
Edit: Es ist noch unklar, warum Schaukel auf diese Weise verhält. Aber wie es aussieht, ist der einzige Weg, um das Zeug zum Laufen zu bringen, die Ereignisse manuell weiterzuleiten, ich werde es tun.
+1 für [sscce] (http://sscce.org/). – trashgod