代码之家  ›  专栏  ›  技术社区  ›  viraptor

将事件传递给父级

  •  9
  • viraptor  · 技术社区  · 14 年前

    JPanel 其中包含 JLabel . 顶端 立即执行鼠标按下和拖动。我需要做些什么,才能让事件看起来像是他们到达目的地 面板 而不是标签本身。(更改源对象很重要)

    3 回复  |  直到 6 年前
        1
  •  15
  •   Tomas Narros    14 年前

    在事件侦听器中,可以将事件分派给父组件。

    存在 myEvent 事件处理函数参数:

    Component source=(Component)myEvent.getSource();
    source.getParent().dispatchEvent(myEvent);
    

    因此,您可以创建单个事件处理程序并重用它,将其添加到所有选定的子级,如下所示:

    final Container parent=this; //we are a the parent container creation code
    MouseListener myCommonListener=new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            parent.dispatchEvent(e);
        }
        @Override
        public void mouseEntered(MouseEvent e) {
            parent.dispatchEvent(e);
        }
        @Override
        public void mouseExited(MouseEvent e) {
            parent.dispatchEvent(e);
        }
        @Override
        public void mousePressed(MouseEvent e) {
            parent.dispatchEvent(e);
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            parent.dispatchEvent(e);
        }
    };
    
    JLabel label=new JLabel("This is the first Label");
    label.addMouseListener(myCommonListener);
    
    JLabel label2=new JLabel("This is the second Label");
    label2.addMouseListener(myCommonListener);
    //... and so on 
    
        2
  •  5
  •   Artjom B.    9 年前

    public class RedispatchingMouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener{
    
        public void mouseClicked(MouseEvent e) {
            redispatchToParent(e);
        }
    
        public void mousePressed(MouseEvent e) {
            redispatchToParent(e);
        }
    
        public void mouseReleased(MouseEvent e) {
            redispatchToParent(e);
        }
    
        public void mouseEntered(MouseEvent e) {
            redispatchToParent(e);
        }
    
        public void mouseExited(MouseEvent e) {
            redispatchToParent(e);
        }
    
        public void mouseWheelMoved(MouseWheelEvent e){
            redispatchToParent(e);
        }
    
        public void mouseDragged(MouseEvent e){
            redispatchToParent(e);
        }
    
        public void mouseMoved(MouseEvent e) {
            redispatchToParent(e);
        }
    
        private void redispatchToParent(MouseEvent e){
            Component source = (Component) e.getSource();
            MouseEvent parentEvent = SwingUtilities.convertMouseEvent(source, e, source.getParent());
            source.getParent().dispatchEvent(parentEvent);
        }
    }
    
        3
  •  1
  •   AyCe    6 年前

    鼠标事件会自动指向 有鼠标侦听器

    因此,要实现您的目标,只需删除JLabel上的所有鼠标侦听器,它就永远不会被选为鼠标事件的目标。

    以下代码将递归地禁用给定组件及其子组件上的鼠标侦听器:

    public static void disableMouseForComponent(Component... components) {
        for (Component c : components) {
            if (c instanceof Container) {
                disableMouseForComponent(((Container) c).getComponents());
            }
            for (MouseListener l : c.getMouseListeners()) {
                c.removeMouseListener(l);
            }
            for (MouseMotionListener l : c.getMouseMotionListeners()) {
                c.removeMouseMotionListener(l);
            }
        }
    }