2017-03-03 54 views
1

我的FatherPanel通过鼠标输入(红色)/退出(橙色)鼠标事件改变颜色。它工作的很好,但是当我输入按钮“Testbutton”(这是我的父面板的子组件)时,出现鼠标退出事件。但我仍然在我的父亲小组内。如何避免子GUI对象接管鼠标侦听器?

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

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

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

你还可以添加一个MouseListener的哪个编辑父亲面板 – XtremeBaumer

+0

Java的图形用户界面有不同的OS”,屏幕大小,屏幕分辨率等方面的工作在不同的地区使用不同PLAFs颜色的按钮。因此,它们不利于像素的完美布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 –

+0

@XtremeBaumer:我想过,但是我必须对每个子组件做这件事。必须有一个更简单的方法... – Serek

回答

2

在事件的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更容易,因为你只需要实现你要处理的方法。

+0

Thx为你的解决方案。但是,我问自己,是否有办法让子组件(在我的情况下是按钮)将鼠标输入事件传递给父面板。但我不知道在哪个主题下搜索。我认为它会像“行动传递”或“事件传递”。你能帮我看看吗? – Serek

+0

@Serek,如果您向组件添加侦听器,组件只会侦听事件。所以你可以添加一个监听器到按钮,然后你可以使用Component.dispatchEvent(...)。但是您需要转换事件以将事件的来源更改为面板,而不是添加额外工作的按钮。你已经说过你不想为所有的组件添加一个监听器,所以我给了你一个简单的解决方案。 – camickr

+0

不要忘记单击复选标记“接受”答案,以便人们知道问题已解决。 – camickr

相关问题