使用 DefaultListModel 作為 JList 數據模型,調用 data.remove(index) 刪除選中項後,列表視圖未正確刷新,點擊空白區域拋出 ArrayIndexOutOfBoundsException: -1。
ListSelectionListener.valueChanged 事件在模型數據刪除時也會觸發。此時 list.getSelectedIndex() 返回 -1(無選中項),但代碼未判斷直接調用 data.get(-1) 導致異常。
@Override
public void valueChanged(ListSelectionEvent e) {
// 忽略正在調整的事件,且必須檢查索引有效性
if (!e.getValueIsAdjusting() && list.getSelectedIndex() >= 0) {
Address address = (Address) data.get(list.getSelectedIndex());
nameField.setText(address.name);
emailField.setText(address.email);
}
}
getSelectedIndex() >= 0,防止無選中時訪問模型。!e.getValueIsAdjusting() 過濾連續調整過程中的中間事件。DefaultListModel 不是線程安全的,確保在 EDT (Event Dispatch Thread) 中操作。