如何避免子 GUI 对象接管鼠标侦听器?

How to avoid child-GUI-objects to take over mouse listener?

我的 FatherPanel 通过鼠标进入(红色)/退出(橙色)鼠标事件改变颜色。效果很好,但是当我输入按钮 "Testbutton"(这是我父亲面板的子组件)时,会出现鼠标退出事件。但我还在我父亲的面板里。

有人可以向我解释为什么会出现这样的问题以及如何解决吗?

只要我的鼠标在该面板内,我希望父面板为橙色(无论鼠标是否在子对象上)。

public class MainFrame extends JFrame {

    public MainFrame() {

        FatherPanel fatherPanel = new FatherPanel();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 700);
        setLayout(null);

        add(fatherPanel);
        fatherPanel.setBounds(150, 20, 300, 300);
    }


    public class FatherPanel extends JPanel{

        JButton btn1 = new JButton("Testbutton");

        public FatherPanel() {
            setSize(300, 300);
            setLayout(null);
            setBackground(Color.RED);

            add(btn1);
            btn1.setBounds(150, 150, 100, 100);

            addMouseListener(new MouseListener() {

                @Override
                public void mouseReleased(MouseEvent e) {
                }

                @Override
                public void mousePressed(MouseEvent e) {
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    setBackground(Color.RED);
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    setBackground(Color.ORANGE);
                }

                @Override
                public void mouseClicked(MouseEvent e) {
                }
            });
        }
    }
}

在mouseExited事件中可以查看鼠标点是否还在父组件的边界内。

类似于:

addMouseListener(new MouseAdapter()
{
    @Override
    public void mouseExited(MouseEvent e)
    {
        Rectangle r = e.getComponent().getBounds();
        Point p = e.getPoint();

        if (p.x < 0 || p.x >= r.width
        ||  p.y < 0 || p.y >= r.height)
            setBackground( Color.RED );
    }

    @Override
    public void mouseEntered(MouseEvent e)
    {
        setBackground( Color.ORANGE );
    }
});

注意:扩展 MouseAdapter 更容易,因为您只需要实现要处理的方法。