2009-08-19 28 views
9

Có thể một số người vui lòng giải thích cho tôi tại sao đoạn mã này in ra bàn điều khiển khi bạn di chuột qua hộp kiểm? Sự kiện "thay đổi" diễn ra như thế nào?Trình nghe thay đổi JCheckbox được thông báo về chuột qua các sự kiện

import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JCheckBox c = new JCheckBox("Print HELLO"); 
     c.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("HELLO"); 
      } 
     }); 
     f.getContentPane().add(c); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

LƯU Ý: Tôi không sử dụng một người biết lắng nghe hành động bởi vì trong chương trình của tôi tôi muốn để có thể làm:

checkBox.setSelected(boolean) 

và có người nghe tôi thông báo, mà không thể được thực hiện với một người nghe hành động. Vậy có cách nào để vô hiệu hóa sự kiện "di chuột qua" này hay cách khác để tôi có thể triển khai trình nghe của mình không?

+0

Rất tiếc, tôi nghĩ sử dụng 'setSelected' sẽ kích hoạt người nghe thay đổi. Tôi phải nghĩ về điều gì đó khác. – jeef3

+0

Nếu tôi chạy nó trên Java 5 trên Mac OSX, tôi không nhận được chuột qua các sự kiện. – banjollity

+0

@ jeef3: setSelected DOES kích hoạt sự kiện thay đổi. Đó là lý do tại sao tôi đang sử dụng nó. Vấn đề là sự kiện thay đổi cũng được kích hoạt bởi chuột qua chuyển động :) –

Trả lời

28

Bạn nhận các sự kiện khi di chuột qua khi tiêu điểm thu được/bị mất biểu thị thay đổi trạng thái của thành phần.

Thay vào đó bạn có thể sử dụng một ItemListener sẽ cung cấp cho bạn ItemEvents.

Đối tượng triển khai giao diện ItemListener nhận ItemEvent này khi sự kiện xảy ra. Trình lắng nghe được giải phóng chi tiết về việc xử lý các chuyển động của chuột riêng lẻ và các lần nhấp chuột, và thay vào đó có thể xử lý sự kiện "có ý nghĩa" như "mục được chọn" hoặc "mục đã bỏ chọn".

Bạn có thể thêm nó vào hộp kiểm của mình bằng phương thức addItemListener() trong lớp AbstractButton. Chỉ cần thay thế addChangeListener bằng cách này:

c.addItemListener(new ItemListener() { 

    public void itemStateChanged(ItemEvent e) { 
     System.err.println(e.getStateChange()); 
    } 
}); 
+0

Cảm ơn tác phẩm này. Tôi luôn luôn mặc dù người nghe mục được áp dụng cho danh sách như chỉ các thành phần. :) –

+1

Không sao cả. Nó thực sự ListSelectionListener được sử dụng cho danh sách. Có một giao diện khác cho danh sách và nút vì các lựa chọn danh sách cần hỗ trợ chọn một dải ô yêu cầu loại sự kiện khác. – Aaron

1

Trạng thái của hộp kiểm (thậm chí chỉ là kiểu hộp kiểm) thay đổi tùy thuộc vào việc nó có con chuột hay không. Vì vậy, một sự kiện thay đổi trạng thái nên được mong đợi.

Vì vậy, chỉ cần kiểm tra lại để xem trạng thái của hộp kiểm là gì và cập nhật cho phù hợp. Tốt hơn là đi thẳng cho mô hình, thay vì sử dụng giao diện thành phần "cồng kềnh".

6

c.setRolloverEnabled(false) `và bạn sẽ không nhận được bất kỳ sự kiện nào cho chuyển động của chuột.

Các vấn đề liên quan