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

时间:2012-06-18 21:42:40

标签: java swing mouseevent

我有一个包含多个子组件的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事件,但由于子组件拦截了这些事件,我不知道该如何去做这个(我不一定能控制子组件,所以如果我愿意,我不能将鼠标事件转发给父事件。)

4 个答案:

答案 0 :(得分:7)

例如

enter image description here

enter image description here

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() {
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

AMouseListener aMouseListener=new  AMouseListener();

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

答案 3 :(得分:0)

我知道这已经很老了,但是这是一个简单的解决方案,您可以使用它为组件及其边界内的所有组件创建鼠标侦听器(无需将侦听器单独添加到所有组件):

mouseExited(mouseEvent)

注意:一旦鼠标退出此侦听器的根组件,mouseExited(mouseEvent)可能不会触发,但是您只需将鼠标侦听器添加到根组件本身,它就会触发。
{{1}}通常并不可靠。