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

时间:2017-03-03 12:40:09

标签: java swing events mouselistener

我的FatherPanel通过鼠标输入(RED)/退出(ORANGE)鼠标事件更改颜色。它运作良好,但当我进入按钮" 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) {
                }
            });
        }
    }
}

1 个答案:

答案 0 :(得分:2)

在mouseExited事件中,您可以检查鼠标点以查看它是否仍在父组件的边界内。

类似的东西:

public int minsteNummer(Integer[] nummer) {
  int minste = Integer.MAX_VALUE; 

  for(int i = 0; i< nummer.length; i++){
    if(nummer[i] < minste ) {
        minste = nummer[i] ;
  }
  if(minste != Integer.MAX_VALUE)
       return minste;
  else
       return 0;
} 

注意:扩展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 ); } }); 更容易,因为您只需要实现您想要处理的方法。