簡體   English   中英

從JList刪除元素不起作用

[英]Removing element from JList is not working

我有一個JList列出了arrayList。 當我按下名為刪除的按鈕時,我想從列表(最好是數組列表)中刪除選定的元素。 目前,我有以下代碼,但是它不起作用。 我的意思是,如果選擇一個元素,它似乎什么也不做,當什么都沒有選擇時,它給我一個ArrayIndexOutOfBoundsException。

private JList listOrders = new JList(arrayList.toArray());

public void myList() {
    listOrders.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION );
    panelForLists.add(listOrders);
}

public void updateList() {
    listOrders.setListData(arrayList.toArray());
    listOrders.revalidate();
    listOrders.repaint();
}

public void actionPerformed(ActionEvent event) {
    if (event.getSource() == deleteItem) {
         int index = listOrders.getSelectedIndex();
            listOrders.remove(index);
           updateList();
    }
}

我想也許是因為我必須在某個地方添加ListSelectionListener,但是我不知道該如何工作。 我已經在互聯網上搜索了年齡的答案,這就是我從JList oracle演示中得到的。

非常感謝!

您似乎正在從列表中刪除項目,然后在調用updateList()時又將其重新添加回去,並且此方法在JList上調用setListData(...) 我認為您應該擺脫這種方法。 ListModel應該保存數據,並且在更改其數據后無需在JList上調用revalidate()repaint()

這基本上是《氣墊船充滿鰻魚》已經回答的內容,但是還有更多的代碼指針。

  1. 實際上,您確實已刪除並重新添加了元素,但這當然沒有效果。 最簡單的方法是將ArrayList可以直接用作ListModel但這是不可能的(因為ArrayList不會觸發任何事件)。 您可能很想使用JList( Vector )構造函數,但是此后不允許修改Vector。 因此,您將不得不創建自己的ListModel DefaultListModel類可能正是您要尋找的。
  2. actionPerformed方法中的代碼始終假定已選擇一個元素。 請注意,如果未選擇任何內容,則getSelectedIndex方法將返回-1。 對於用戶而言,最好的辦法是在未選擇任何內容或選擇一個以上元素時禁用刪除按鈕。 這可以通過讓按鈕后面的動作偵聽列表的選擇模型並根據選擇更新其啟用狀態來實現(請不要忘記在需要時觸發PropertyChangeEvent )。 如果您不使用Action備份按鈕,則只需根據選擇直接切換按鈕的啟用狀態。

您需要使用ListModel刪除選定的元素。

int index = listOrders.getSelectedIndex();
ListModel model = listOrders.getModel();

當您調用setListData時, JList使用javax.swing.AbstractListModel來構建模型。

您需要實現自己的ListModel ,以便為put CRUD方法擴展javax.swing.AbstractListModel

您可以創建一個可以正確更新它的模型

class ArrayListModel<T> extends AbstractListModel{

    private final List<T> arr = new ArrayList<T>();
    public int getSize(){
        return arr.size();
    }

    public T getElementAt(int ind){
        return arr.get(ind);
    }

    public void remove(int ind){
        arr.remove();
        fireIntevalRemoved(this,ind,ind);
    }


    public void add(T obj){
        arr.add(obj);
        fireIntevalAdded(this,arr.size(),arr.size());
    }

    public void setData(List<T> list){
        int size=arr.size();
        arr.clear();
        arr.addAll(list);
        fireIntevalChanged(this,0,arr.size()>size?arr.size():size);
    }

}

並使用setModel設置列表的模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM