2012-04-06 47 views
4

我正在做一個基於swing的應用程序,其中有一個JList,它定期獲取相同數據的不同順序更新,不常更新新項目,並且不常更新少項目。我試圖找出最佳的方式,使這看起來不錯。現在,我只是打電話對JList進行流暢重新排序的「最佳」方法是什麼?

JList.setListData(String [] data); 

這看起來不太好,它會清除選定的項目。

我想要一種方法來更新它,只有清除選中的項目,如果它從列表中刪除,但保持相同的項目被選中,即使它們的索引更改。我正在考慮跟蹤哪些索引被選中,然後在更改數據後設置所選項目,但聽起來很可怕。我還查看了ListModels並跟蹤了我自己的內容,但似乎選擇了哪些項目保存在JList本身中,以至於無法完美地工作。

我真的很感激任何建議。

+0

'setListData()'的實現是否相關? [sscce](http://sscce.org/),例如[this one](http://stackoverflow.com/a/10048030/230513)可能會有所幫助。 – trashgod 2012-04-06 19:16:25

+0

使用支持ui級別排序/過濾的JXList(Swingx的一部分)。請注意,所有模型裝飾解決方案在通知批量修改時都是無效的(我們通常可以將其作爲更常見的查詢粒度單項:-) – kleopatra 2012-04-07 09:33:03

回答

4

我給你做工作的例子。

我已經使用了JList像你所要求的那樣,添加了從列表中添加和刪除的按鈕。

無論如何,希望這有助於!

乾杯。

public class Test { 

    private static String selectedValue = null; 
    private static JList jList = new JList(); 

    public static void main(String args[]) { 
     JFrame jFrame = new JFrame(); 
     jFrame.setSize(500, 500); 
     jFrame.setLocationRelativeTo(null); 
     jFrame.setLayout(new GridLayout(4, 1)); 

     jList = new JList(new String[]{"1", "2", "3", "4", "5"}); 
     jFrame.add(jList); 

     JButton rearrangeButton = new JButton("rearrange"); 
     rearrangeButton.addActionListener(new Test().new SelectedListener()); 
     jFrame.add(rearrangeButton); 

     JButton addButton = new JButton("add"); 
     addButton.addActionListener(new Test().new SelectedListener()); 
     jFrame.add(addButton); 

     JButton deleteButton = new JButton("delete"); 
     deleteButton.addActionListener(new Test().new SelectedListener()); 
     jFrame.add(deleteButton); 

     jFrame.setVisible(true); 
    } 

    private class SelectedListener implements ActionListener { 

     public void actionPerformed(ActionEvent actionEvent) { 
      storeSelected(); 

      if (actionEvent.getActionCommand().equalsIgnoreCase("rearrange")) { 
       jList.setListData(new String[]{"5", "4", "3", "2", "1"}); 
      } else if (actionEvent.getActionCommand().equalsIgnoreCase("add")) { 
       List< String> items = new ArrayList< String>(); 

       for (int item = 0; item < jList.getModel().getSize(); item++) { 
        items.add(jList.getModel().getElementAt(item).toString()); 
       } 

       items.add("new"); 

       jList.setListData(items.toArray()); 
      } else if (actionEvent.getActionCommand().equalsIgnoreCase("delete")) { 
       List< String> items = new ArrayList< String>(); 

       for (int item = 0; item < jList.getModel().getSize(); item++) { 
        items.add(jList.getModel().getElementAt(item).toString()); 
       } 

       items.remove(0); 

       jList.setListData(items.toArray()); 
      } 

      reSelect(); 
     } 
    } 

    private static void storeSelected() { 
     if (jList.getSelectedIndex() > -1) { 
      selectedValue = jList.getSelectedValue().toString(); 
     } else { 
      selectedValue = null; 
     } 
    } 

    private static void reSelect() { 
     if (selectedValue != null) { 
      jList.setSelectedValue(selectedValue, true); 
     } 
    } 
} 
+0

[sscce] +1(http://sscce.org/)。你將如何處理多個選擇?編輯:對大括號抱歉。 :-) – trashgod 2012-04-06 19:15:48

+0

這看起來很棒,我會研究它,並給它一個旋轉 – Nico 2012-04-07 02:44:31

+0

我通過編輯storeSelected()來處理多個選擇來保存值的數組(JList.getSelectedValues()),然後在重新選擇,我計算每個這些值的索引,然後使用setSelectedIndices(int [] indices)將它們全部設置。這不是最乾淨的,但它的工作原理。謝謝您的幫助!!! – Nico 2012-04-07 07:11:54

4

看來標準的JList有沒有方法來調整排序(你到底爲什麼他們只補充說,到JTable ...),但有一個tutorial for sorted lists

+0

+1好文章;也考慮一個列上的JTable。 – trashgod 2012-04-06 19:14:04

+0

這是一篇很好的文章,它看起來像是正確的做法。 – Nico 2012-04-07 07:12:33

+0

與模型裝飾方法一樣的問題:在批量更改的通知期間,排序模型狀態是未定義的... – kleopatra 2012-04-07 09:35:52

相關問題