Detecting mouse enter/exit events anywhere on JPanel

前端 未结 5 1762
北海茫月
北海茫月 2020-12-06 05:36

Basically there is a JPanel on which I want to know when the mouse enters the area of the JPanel and exits the area of the JPanel. So I added a mouse listener, but if there

5条回答
  •  無奈伤痛
    2020-12-06 06:09

    This is sample code implementing Ash's solution. For me, the JFrame did not detect all exit events properly, but an inner JPanel did, so I passed in two components - one for testing descendants and one for testing the boundary.

    Toolkit.getDefaultToolkit().addAWTEventListener(
            new TargetedMouseHandler(this, this.jPanel), 
            AWTEvent.MOUSE_EVENT_MASK);
    }
    
    public class TargetedMouseHandler implements AWTEventListener
    {
    
        private Component parent;
        private Component innerBound;
        private boolean hasExited = true;
    
        public TargetedMouseHandler(Component p, Component p2)
        {
            parent = p;
            innerBound = p2;
        }
    
        @Override
        public void eventDispatched(AWTEvent e)
        {
            if (e instanceof MouseEvent)
            {
                if (SwingUtilities.isDescendingFrom(
                    (Component) e.getSource(), parent))
                {
                    MouseEvent m = (MouseEvent) e;
                    if (m.getID() == MouseEvent.MOUSE_ENTERED)
                    {
                        if (hasExited)
                        {
                            System.out.println("Entered");
                            hasExited = false;
                        }
                    } else if (m.getID() == MouseEvent.MOUSE_EXITED)
                    {
                        Point p = SwingUtilities.convertPoint(
                            (Component) e.getSource(),
                            m.getPoint(),
                            innerBound);
                        if (!innerBound.getBounds().contains(p))
                        {
                            System.out.println("Exited");
                            hasExited = true;
                        }
                    }
                }
            }
        }
    }
    

提交回复
热议问题