簡體   English   中英

在底層組件上觸發鼠標事件

[英]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);
    }
}

當光標移動到其上方的坐標時,在較小的標簽上觸發鼠標輸入事件的最佳方法是什么? 如果多個組件堆疊在一起,它將如何工作? 剩下的鼠標事件如何處理,比如mouseClickedmousePressedmouseReleased等?

在您的聽眾中:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM