摆动鼠标听众被儿童组件拦截

我有一个包含几个子组件的swing组件。 如果鼠标位于任何组件之上,我想要做的是更改某些标签,如果鼠标移出所有组件,则将其更改为其他标签。 我正试图找到一种更有效的方法来做到这一点。

目前,我对所有子组件都有鼠标监听器,如下所示:

class AMouseListener extends MouseAdapter { private boolean mouseOver; mouseEntered(MouseEvent e) { mouseOver = true; updateLabel(); } mouseExited(MouseEvent e) { mouseOver = false; updateLabel(); } void updateLabel() { String text = "not-over-any-components"; // listeners are each of the listeners added to the child components for ( AMouseListener listener :listeners ) { if ( listener.mouseOver ) { text = "over-a-component"; break; } } } } 

这是有效的,但我觉得应该有一个更好的方法来处理这个只通过处理父容器上的mouseEntered和mouseExited事件,但由于子组件拦截这些事件,我不知道如何去做(I不一定能控制子组件所以如果我愿意,我不能将鼠标事件转发给父事件。

例如

在此处输入图像描述

在此处输入图像描述

 import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.*; public class TestMouseListener { public static void main(String[] args) { final JComboBox combo = new JComboBox(); combo.setEditable(true); for (int i = 0; i < 10; i++) { combo.addItem(i); } final JLabel tip = new JLabel(); tip.setPreferredSize(new Dimension(300, 20)); JPanel panel = new JPanel(); panel.add(combo); panel.add(tip); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.add(panel); frame.pack(); frame.setVisible(true); panel.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { tip.setText("Outside combobox"); } @Override public void mouseExited(MouseEvent e) { Component c = SwingUtilities.getDeepestComponentAt( e.getComponent(), e.getX(), e.getY()); // doesn't work if you move your mouse into the combobox popup tip.setText(c != null && SwingUtilities.isDescendingFrom( c, combo) ? "Inside combo box" : "Outside combobox"); } }); } private TestMouseListener() { } } 

查看“玻璃窗格”的文档和示例。
这应该可以满足您的需求: 玻璃窗格

您可以启动侦听器的单个实例,并将该实例添加到每个组件。 喜欢这个:

 AMouseListener aMouseListener=new AMouseListener(); for each(Component c:components) { caddMouseListener(aMouseListener); }