我正在寻找一种方法将鼠标事件传递给其他组件所涵盖的组件。为了说明我的意思,这是一个示例代码。它包含两个 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 等等?
答案 0 :(得分:2)
在你的听众中:
bigLabel.dispatchEvent(mouseEvent);
当然,您必须将bigLabel
定义为final
答案 1 :(得分:2)
答案 2 :(得分:0)
要了解发生了什么,您需要了解Z-Ordering的工作原理。作为快速概述,最后添加的组件首先被绘制。因此,在您的情况下,您希望在大组件之前添加小组件。
// add(bigLabel, 0); //Add to the front
add(bigLabel); // add to the end so it is painted first
OverlayLayout可能有助于更好地解释这一点,并为您提供另一种选择。