2012-04-30 73 views
0

我有一個JList列出了一個arrayList。當我按下名爲delete的按鈕時,我想從列表中刪除選定的元素(理想情況下爲數組列表)。目前我有下面的代碼,但它不工作。通過這個我的意思是,如果選擇了一個元素,它似乎什麼也不做,並且當沒有選中任何元素時,它給了我一個ArrayIndexOutOfBoundsException。從JList中刪除元素不起作用

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演示中得出的結論。

非常感謝!

+0

你必須測試'if(listOrders。getSelectedIndex()> -1)'在刪除JList的元素的其餘代碼之前 – mKorbel

+0

這可能(幾乎肯定)是非常糟糕的做法,但我設法提出了一個解決方案來解決我的問題:而不是執行listOrders.remove(index );''我使用了'arrayList.remove(index);'使用update方法,然後刷新列表,它有效地從列表中刪除了項目,在一個方法中刪除了列表列表。 – DanMc

回答

3

這基本上就是氣墊船充滿鰻魚已經回答了,但也有一些更多的代碼指針。

  1. 你確實刪除並重新添加元素,這當然沒有效果。最容易的是,如果您的ArrayList可以直接作爲ListModel使用,但這不可能(因爲ArrayList不會觸發任何事件)。您可能會試圖使用構造函數JList(Vector),但那樣做不允許在之後修改向量。所以你堅持創建自己的ListModelDefaultListModel類可能就是你正在尋找的。
  2. actionPerformed方法中的代碼總是假定有一個元素被選中。請注意,getSelectedIndex方法在沒有選擇任何內容時返回-1。你可以做的最好的事情(對於用戶)是當沒有選擇任何東西時,或者當多於一個元素被選擇時禁用刪除按鈕。這可以通過讓按鈕後面的動作監聽列表的選擇模型,並根據選擇更新其啓用狀態(如果需要,不要忘記觸發PropertyChangeEvent)。如果您不使用備份按鈕Action,只需根據所選內容直接切換按鈕的啓用狀態。
+0

謝謝你的回答,這是有幫助的我瞭解ArrayLists如何與JLists合作! – DanMc

4

您似乎要從列表中刪除項目,然後在調用updateList()時再次將其添加,並且此方法在JList上調用setListData(...)。我認爲你應該擺脫這種方法。 ListModel應該保存數據,並且在更改其數據之後,不需要在JList上調用revalidate()repaint()

2

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

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

JList當你調用setListData使用javax.swing.AbstractListModel中用於構建模型。

您需要實施您自己的ListModel擴展javax.swing.AbstractListModel放置CRUD方法。

1

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

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

+0

這個'ArrayListModel'類的附加值是什麼?你仍然不能直接使用'ArrayList',並且需要對'ListModel'進行所有修改。那麼爲什麼不堅持'DefaultListModel'呢。一個附加值是切換到一個'Collection',它在元素被添加/刪除時實際觸發事件/ ...並直接使用該'Collection'實例來支持'ListModel',允許修改'集合「或」ListModel「 – Robin

+0

@Robin是的這是一個選項,你可以採取這種方式,但如果你通常不需要這樣的List接口 –