[英]Fire mouse event on underlying components
我正在尋找一種將鼠標事件傳遞給其他組件覆蓋的組件的方法。 為了說明我的意思,這里有一個示例代碼。 它包含兩個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等?
在您的聽眾中:
bigLabel.dispatchEvent(mouseEvent);
當然,您必須將bigLabel
定義為final
看看 Alexander Potochkin 在A Well-Behaved GlassPane上的博客條目
要了解正在發生的事情,您需要了解 Z-Ordering 的工作原理。 作為快速概覽,最后添加的組件首先被繪制。 因此,在您的情況下,您希望在大組件之前添加小組件。
// add(bigLabel, 0); //Add to the front
add(bigLabel); // add to the end so it is painted first
OverlayLayout可能有助於更好地解釋這一點並為您提供另一種選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.