我正在尋找一種方法將鼠標事件傳遞給其他組件所覆蓋的組件。爲了說明我的意思,下面是一個示例代碼。它包含兩個JLabel s,其中一個小兩倍,並且完全覆蓋一個更大的標籤。如果將鼠標懸停在標籤上,只有較大的一個觸發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等?
我很抱歉,但我必須要問亞歷山大Potochkin的博客文章 - 爲什麼你要這麼做?這似乎不是一個非常直觀的事情,通常意味着維護問題。 – Nemi 2009-12-11 18:42:35
這只是一個示例代碼。真正的交易在其他組件的集合上具有隱形面板。頂部的面板根據不同的條件執行各種任務。例如,如果移位被保持,那麼您可以抓取並移動具有下面組件的整個組件。由於解釋現實生活場景的所有細節是困難的(也是無關緊要的),我認爲這很好地說明了這個問題。另外,這可能不是最好的方法,但我沒有可能重寫組件(主要是因爲時間)。 – 2009-12-14 11:06:54