我需要帮助来理解Swing中的事件传播.我知道每个事件只由一个组件处理.因此,当我有一个outside带有一些子面板的面板inside并且我将mouseListeners添加到它们时,inside将会调用其中一个.这很好,这是预期的行为.
但我不理解以下情况中的行为:
inside注册MouseMotionListener并outside注册MouseListener.我希望inside使用所有MouseMotionEvents并outside接收MouseEvents,因为没有正常MouseEvents的监听器inside.但事实并非如此,inside不仅仅消耗MouseMotionEvents的所有MouseEvent.
以下代码说明了该问题:
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 …Run Code Online (Sandbox Code Playgroud) 在Swing应用程序中,我有许多子面板,每个子面板都听一个JSlider.周围的父面板也会监听所有子面板.为了在下面的示例中获得一致的结果,我必须首先添加父级,然后添加本地侦听器.考虑到本文中规定EventListenerList和解释的顺序,这是有道理的.我可以依赖该订单,还是应该安排发送不同的活动?
class SubPanel extends JPanel implements ChangeListener {
private final JSlider slider = new JSlider();
private final JLabel label = new JLabel();
private final String name;
private float value;
public SubPanel(String name, float value, ChangeListener parent) {
this.name = name;
this.value = value;
...
slider.addChangeListener(parent);
slider.addChangeListener(this);
}
...
}
Run Code Online (Sandbox Code Playgroud)
附录:讨论EventListenerList似乎是实施建议而不是保证.pstanton建议的链接方法更可靠地强制执行正确的顺序.例如,SubPanel的ChangeListener可以简单地将事件转发到父.
@Override
public void stateChanged(ChangeEvent e) {
...
parent.stateChanged(e);
}
Run Code Online (Sandbox Code Playgroud)