2009-03-14 6 views
7

Tôi có một JList với một số mục. Tôi đã thêm một người nghe khi một mục trong danh sách được chọn. Đây là mã cho những gì sẽ xảy ra khi một mục trong danh sách được chọn:Tại sao lựa chọn JList xảy ra hai lần?

private void questionaireNamesListValueChanged(ListSelectionEvent evt) { 
    try { 
     inputPanel.setEnabled(false); 
     inputPanel.setVisible(false); 
     inputTextField.setText(""); 
     inputStatusLabel.setText(""); 
     int questionaireIndex = questionaireNamesList.getSelectedIndex(); 

     // Why will this be printed twice? 
     System.out.println("Questionaire Index: " + questionaireIndex); 

     if (remoteQuestionServer.getQuestionCount(questionaireIndex) == 5) { 
      answerQuestionButton.setEnabled(true); 
      addQuestionButton.setEnabled(false); 
     } else { 
      addQuestionButton.setEnabled(true); 
      answerQuestionButton.setEnabled(false); 
     } 
    } catch (RemoteException ex) { 
     ex.printStackTrace(); 
    } 
} 

Như bạn có thể ở trên tôi đặt một tuyên bố System.out.print trong và mỗi khi tôi click vào một cái gì đó trong danh sách tôi nhận được hai ouputs cho mục đó , ví dụ.

Questionaire Index: 4 
Questionaire Index: 4 
Questionaire Index: 2 
Questionaire Index: 2 
Questionaire Index: 0 
Questionaire Index: 0 
Questionaire Index: 2 
Questionaire Index: 2 

Bất kỳ ý tưởng nào tại sao điều này đang xảy ra?

Cảm ơn, Patrick

Trả lời

13

Khi bạn thay đổi sự lựa chọn, một hoặc hai sự kiện có thể xảy ra, tùy thuộc vào việc thực hiện. Nếu chỉ mục số 4 được chọn và bạn nhấp vào mục thứ hai, thì điều sau xảy ra:

  • Đầu tiên, chỉ số # 4 được CHỌN. Tùy thuộc vào kiểu máy, questionaireNamesList.getSelectedIndex() có thể trả về mặt pháp lý là 2 hoặc -1.
  • giây, chỉ mục số 2 được CHỌN. Tại thời điểm này, questionaireNamesList.getSelectedIndex() chắc chắn sẽ trả lại 2.

Do đó, có hai sự kiện được kích hoạt. Định nghĩa về cách các sự kiện này được tạo ra cho phép mất nhiều thời gian cho các triển khai JVM khác nhau làm những việc hơi khác đi.

LƯU Ý: Có thể bạn nên kiểm tra giá trị của ListSelectionEvent#getValueIsAdjusting() để xem sự kiện bạn đang xử lý có là một trong một loạt sự kiện hay không. Bạn có thể cần phải bỏ qua tất cả các sự kiện mà điều này trả về true.

+0

Nếu chỉ mục 4 được bỏ chọn thì tại sao getSelectedIndex() trả về 4 chứ không phải -1? –

+0

Tôi đã chỉnh sửa câu trả lời của mình để giải thích. – Eddie

+0

Bạn nói nếu chỉ số # 4 được CHỌN thì nó có thể trả về 2 hoặc -1 một cách hợp pháp. Tại sao 2? –

2

Ngoài câu trả lời của Eddie, hãy xem phương thức getValueIsAdjusting trong sự kiện.