2009-09-10 9 views
5

Tôi muốn được thông báo về các sự kiện chuột (cụ thể là các sự kiện chuột được nhập và thoát) trên JFrame của tôi. Nhưng khi tôi thêm một mouselistener vào nó tôi nhận được các sự kiện trên biên giới của khung chứ không phải toàn bộ khung với nội dung của nó.MouseListener trên JFrame

Bất kỳ ý tưởng nào về lý do tại sao?

CHỈNH SỬA: Hoặc ít nhất bạn có giải pháp thay thế không? Tôi muốn một cách "gloabal" để bắt các sự kiện chuột trên JFrame. Có lẽ một mouselistener không phải là câu trả lời.

Trả lời

2

Vì nội dung (có thể là JPanel) đang "che khuất" và tiêu thụ các sự kiện và chúng không đạt được JFrame.

Điều bạn có thể làm là thêm cùng một người nghe cho tất cả trẻ em. Nên có một cách tốt hơn.

5

Có một thành phần vô hình phủ lên toàn bộ GUI, "ngăn kính". Bạn có thể đính kèm người nghe của bạn vào đó. Ví dụ:

JFrame frame = new JFrame(); 
Component glassPane = frame.getGlassPane(); 
glassPane.addMouseListener(myListener); 

Nếu bạn muốn các sự kiện bị chặn đi qua các thành phần cơ bản, bạn có thể redispatch chúng. Ví dụ:

public void mouseMoved(MouseEvent e) { 
    redispatchMouseEvent(e, false); 
} 
+0

tôi sẽ phải bật tính năng này. điều này sẽ ngăn các thành phần bên dưới nhận các sự kiện –

+0

Bạn có thể in lại. Xem câu trả lời đã sửa đổi của tôi. – SingleShot

+0

Có toàn bộ vấn đề khi bật ngăn kính. Nó được mô tả tốt nhất trong các khách hàng giàu có của Filthy. Bạn cần phải thấy trước tất cả các vấn đề và khắc phục chúng. Ví dụ, bạn cũng cần tính đến các sự kiện quan trọng, thay đổi con trỏ chuột trong số những thứ khác. Tôi đang tìm một giải pháp đã sẵn sàng. một cái gì đó được thiết kế để thông báo về các sự kiện chuột trên một mức khung hình. –

2

Một thay thế cho AWTEventListener là để đẩy một EventQueue. Điều này có lợi thế là các applet và ứng dụng WebStart có thể làm điều này.