在底层组件上触发鼠标事件

时间:2009-12-11 14:47:50

标签: java swing events

我正在寻找一种方法将鼠标事件传递给其他组件所涵盖的组件。为了说明我的意思,这是一个示例代码。它包含两个 JLabel ,一个小两倍,完全覆盖一个更大的标签。如果将鼠标悬停在标签上,则只有较大的标签会触发 mouseEntered 事件。

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;

public class MouseEvtTest extends JFrame {

    public MouseEvtTest() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(null);
        setSize(250, 250);

        MouseAdapter listener = new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.printf("Mouse entered %s label%n", e.getComponent().getName());
            }
        };
        LineBorder border = new LineBorder(Color.BLACK);

        JLabel smallLabel = new JLabel();
        smallLabel.setName("small");
        smallLabel.setSize(100, 100);
        smallLabel.setBorder(border);
        smallLabel.addMouseListener(listener);
        add(smallLabel);

        JLabel bigLabel = new JLabel();
        bigLabel.setName("big");
        bigLabel.setBorder(border);
        bigLabel.setSize(200, 200);
        bigLabel.addMouseListener(listener);
        add(bigLabel, 0); //Add to the front
    }

    public static void main(String[] args) {
        new MouseEvtTest().setVisible(true);
    }
}

当光标移动到上面的坐标时,在较小的标签上触发鼠标输入事件的最佳方法是什么?如果将多个组件堆叠在一起,它将如何工作?剩下的鼠标事件如 mouseClicked mousePressed mouseReleased 等等?

3 个答案:

答案 0 :(得分:2)

在你的听众中:

bigLabel.dispatchEvent(mouseEvent);

当然,您必须将bigLabel定义为final

答案 1 :(得分:2)

A Well-Behaved GlassPane

上查看Alexander Potochkin的博客文章

答案 2 :(得分:0)

要了解发生了什么,您需要了解Z-Ordering的工作原理。作为快速概述,最后添加的组件首先被绘制。因此,在您的情况下,您希望在大组件之前添加小组件。

// add(bigLabel, 0); //Add to the front
add(bigLabel); // add to the end so it is painted first

OverlayLayout可能有助于更好地解释这一点,并为您提供另一种选择。