2012-09-17 47 views
18

Gần đây tôi đã gặp lỗi trong java, nơi JList sẽ kích hoạt phương thức valueChanged() hai lần khi thay đổi giá trị bằng chuột và chỉ một lần khi thay đổi giá trị bằng bàn phím. Tôi chỉ tìm thấy a bug về vấn đề này trên trang web của Oracle (rõ ràng là lỗi hơn mười hai tuổi) và tôi tự hỏi liệu có ai có thể giải thích cho tôi không. đề cập đến getValueIsAdjusting() trả về false khi bàn phím được sử dụng).Giá trị cháy JListChỉ thay đổi hai lần khi giá trị được thay đổi qua chuột

Đối với bất kỳ ai gặp vấn đề này, tôi thấy rằng chỉ cần kiểm tra khi getValueIsAdjusting() là sai, sau đó chạy phần còn lại của phương pháp của tôi sẽ giải quyết vấn đề.

+2

Xem thêm http://stackoverflow.com/a/12193333/1076463 – Robin

+1

các câu hỏi ở đây là gì? –

+3

nó không phải là một lỗi, đó là một tính năng ;-) Nghiêm túc, nó cũng được biết đến (ho .. quên nó đôi khi) mà hầu hết thời gian chỉ thông báo với! Bên cạnh đó, bạn chính xác phàn nàn về điều gì? – kleopatra

Trả lời

39

Có một giải thích đơn giản.
Khi bạn đang áp dụng lựa chọn với chuột bạn thực hiện một danh sách các hành động:

1. Nhấn nút chuột trái trên một số yếu tố
- danh sách lựa chọn một yếu tố dưới chuột và cháy sự kiện 1st
- cũng ở đây bạn sẽ nhận được getValueIsAdjusting = true kể từ khi chuột được chưa được phát hành

2. bạn có thể kéo chuột mà không phát hành nó để thay đổi lựa chọn
- danh sách sẽ cháy một sự kiện bổ sung cho mỗi sự thay đổi lựa chọn làm
- getValueIsAdjusting sẽ cũng đúng đối với mỗi người trong số những sự kiện kể từ khi bạn vẫn đang làm thay đổi

3. Bạn thả chuột
- danh sách sẽ cháy sự kiện cuối cùng - hoạt động lựa chọn xong
- getValueIsAdjusting = false bây giờ, bạn có thể làm bất cứ điều gì bạn muốn với lựa chọn cuối cùng

Để tóm tắt - những sự kiện bổ sung được kích hoạt để cho phép bạn hoàn toàn kiểm soát hành vi danh sách trên các thay đổi lựa chọn (trên chuỗi thay đổi lựa chọn chính xác). Bạn có thể muốn bỏ qua các thay đổi lựa chọn khi getValueIsAdjusting = true vì sẽ luôn có một sự kiện cuối cùng với getValueIsAdjusting = false, nó sẽ thông báo cho bạn rằng các thay đổi lựa chọn đã hoàn tất.

Ngoài ra, khi bạn thay đổi lựa chọn bằng danh sách nút khóa sẽ không biết liệu bạn có thay đổi nó sau lần bấm phím đầu tiên hay không, vì vậy getValueIsAdjusting sẽ luôn sai cho những thay đổi đó.

+0

Điều đó giải thích khá tốt, cảm ơn bạn. – TGP1994

19

Có một giải pháp đơn giản:

private void jList1 ValueChanged(javax.swing.event.ListSelectionEvent evt) { 

    if (!evt.getValueIsAdjusting()) {//This line prevents double events 

    } 

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