2016-07-20 20 views
0

我已經做了TableRowSorter應該更新,其中每列從ASCENDING => DESCENDING => ASCENDING => DESCENDING => ...排序,以ASCENDING => DESCENDING => UNSORTED => ASCENDING => DESCENDING => UNSORTED => ...TableRowSorter還返回不正確SortOrder的

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.SortOrder; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> { 

    public ADU_SortOrder(M model) { 
     setModel(model); 
    } 

    @Override 
    public void toggleSortOrder(int column) { 
     List<? extends SortKey> sortKeys = getSortKeys(); 
     if (sortKeys.size() > 0) { 
      List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
      keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder()))); 
      setSortKeys(keys); 
      return; 
     } 
     super.toggleSortOrder(column); 
    } 

    private SortOrder setNextOrder(SortOrder order) { 
     switch (order) { 
      case ASCENDING: 
       return SortOrder.DESCENDING; 
      case DESCENDING: 
       return SortOrder.UNSORTED; 
      case UNSORTED: 
       return SortOrder.ASCENDING; 
      default: 
       return SortOrder.UNSORTED; 
     } 
    } 
} 

在給出的示例中,我會盡力來形容我所期望的週期發生和實際發生的事情。你有一個JTable兩欄。在開始時使用的SortKeys使得每列中的最後一行都是這樣,以便列是SortOrder.ASCENDING

我期望在這裏發生的將是以下內容。

Sort Order in: Column 1   Column 2 
Start:  ASCENDING   ASCENDING 
Click C1:  DESCENDING   ASCENDING 
Click C1:  UNSORTED   ASCENDING 
Click C2:  UNSORTED   DESCENDING 
Click C1:  ASCENDING   DESCENDING 
Click C2:  ASCENDING   UNSORTED 

實際發生的:

Sort Order in: Column 1   Column 2 
Start:  ASCENDING   ASCENDING 
Click C1:  DESCENDING   ASCENDING 
Click C1:  UNSORTED   ASCENDING 
Click C2:  UNSORTED   ASCENDING 
Click C1:  DESCENDING   ASCENDING 
Click C2:  DESCENDING   UNSORTED 

正如你可以看到越來越列的排序順序點擊的相反,TableRowSorter得到應用的最後一個排序順序,然後只用於下一個排序順序點擊下一列。我如何能夠單獨處理每個列並更新列以使其按預期工作?


這是一個MCV。對於之前沒有包括一個,我表示歉意。

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.SortOrder; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowSorter.SortKey; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class MVC extends JFrame { 
    private static final long serialVersionUID = -8809862571237032846L; 

    private MVC() { 
     setTitle("MVC"); 

     createAndRunGUI(); 

     pack(); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 

    private void createAndRunGUI() { 
     setLayout(new GridLayout(1, 1)); 

     String[] tableHeaders = {"Col 1", "Col 2"}; 
     String[][] tableData = { 
       {"Hi", "Animals"}, 
       {"Bob", "Of"}, 
       {"Phil", "The"}, 
       {"Dog", "World"}, 
       {"Cat", "Include"}, 
       {"Pill", "Fish"}, 
       {"Dab", "Ants"}, 
       {"Bob", "Hippos"}, 
       {"Fill", "Humans"}, 
       {"Space", "TVs"}, 
       {"Up", "Is"}, 
       {"Now", "That"}, 
       {"Even", "Right"}, 
       {"More", "Person"}, 
       {"Data", "?"} 
      }; 

     JTable table = new JTable(tableData, tableHeaders); 
     table.setAutoCreateRowSorter(true); 
     ADU_SortOrder<TableModel> tableSorter = new ADU_SortOrder<TableModel>(table.getModel()); 
     List<SortKey> keys = new ArrayList<SortKey>(); 
     //keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING)); 
     //keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING)); 
     tableSorter.setSortKeys(keys); 
     table.setRowSorter(tableSorter); 

     JScrollPane myScrollTable = new JScrollPane(table); 
     myScrollTable.setPreferredSize(new Dimension(600, 600)); 

     JPanel cont = new JPanel(); 
     cont.add(myScrollTable); 

     getContentPane().add(cont); 
    } 

    public static void main(String[] args) { 
     new MVC(); 
    } 

    private class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> { 
     public ADU_SortOrder(M model) { 
      setModel(model); 
     } 

     @Override 
     public void toggleSortOrder(int column) { 
      List<? extends SortKey> sortKeys = getSortKeys(); 
      if (sortKeys.size() > 0) { 
       List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
       keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder()))); 
       setSortKeys(keys); 
       return; 
      } 
      super.toggleSortOrder(column); 
     } 

     private SortOrder setNextOrder(SortOrder order) { 
      switch (order) { 
       case ASCENDING: 
        return SortOrder.DESCENDING; 
       case DESCENDING: 
        return SortOrder.UNSORTED; 
       case UNSORTED: 
        return SortOrder.ASCENDING; 
       default: 
        return SortOrder.UNSORTED; 
      } 
     } 
    } 
} 

編輯2
綜觀具體方法toggleSortOrder而在程序運行很明顯的,問題是與代碼的一部分,其表示setNextOrder(keys.get(0).getSortOrder())。這是因爲當代碼返回getSortKeys()作爲ArrayList時,列表的大小隻有01。這意味着當列表的長度爲1代碼get(0)返回排序的最後一列,但代碼get(column)將導致IndexOutOfBoundsException。那麼我怎麼能讓程序得到每一列的SortKeys

@Override 
public void toggleSortOrder(int column) { 
    System.out.println("Column: " + column); 
    List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
    System.out.println("List Size: " + keys.size()); 
    if (keys.size() > 0) { 
     keys.set(0, new SortKey(column, setNextOrder(keys.get(0).getSortOrder()))); 
     setSortKeys(keys); 
     return; 
    } 
    super.toggleSortOrder(column); 
} 

編輯3

使用Andreas'建議我創建了一個辦法能夠使用keys.set(column, new SortKey(column, setNextOrder(keys.get(column).getSortOrder())));

List<SortKey> keys = new ArrayList<SortKey>(); 

@Override 
public void toggleSortOrder(int column) { 
    System.out.println("Column: " + column); 
    System.out.println("List Size: " + keys.size()); 
    if (keys.size() > 0) { 
     keys.set(column, new SortKey(column, setNextOrder(keys.get(column).getSortOrder()))); 
     setSortKeys(keys); 
     return; 
    } 
    super.toggleSortOrder(column); 
} 

private SortOrder setNextOrder(SortOrder order) { 
    switch (order) { 
     case ASCENDING: 
      return SortOrder.DESCENDING; 
     case DESCENDING: 
      return SortOrder.UNSORTED; 
     case UNSORTED: 
      return SortOrder.ASCENDING; 
     default: 
      return SortOrder.UNSORTED; 
    } 
} 

private void initialSortOrder(M model) { 
    for(int i = 0; i < model.getColumnCount(); i++) { 
     keys.add(new RowSorter.SortKey(i, SortOrder.ASCENDING)); 
    } 
} 

然而,使用這種方法第1列可以進行排序,但只有字OfHippo可以在第二列中排序。我知道這已經變成了一個非常長的問題和抱歉,但我很欣賞任何幫助

+0

請參閱[什麼是調試器,它如何幫助我診斷問題?](http://stackoverflow.com/q/25385173/5221149)。另請閱讀[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Andreas

+0

@Andreas我包括一個MCV,真的很感激任何幫助 – Dan

+0

那麼當你用調試器運行代碼時,你看到了什麼? – Andreas

回答

0

爲了解決這個問題,我需要添加幾個if語句和一個或兩個變量。

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.SortOrder; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> { 
    public ADU_SortOrder(M model) { 
     setModel(model); 
    } 

    boolean firstTime = true; //Needed in case there are any initial sort keys 
    int columnHolder = -1; 

    @Override 
    public void toggleSortOrder(int column) { 
     List<? extends SortKey> sortKeys = getSortKeys(); 
     if(sortKeys.size() == 0) { //For if there are no initial sort keys 
      List<SortKey> keys = new ArrayList<SortKey>(); 
      keys.add(new SortKey(column, SortOrder.ASCENDING)); 
      setSortKeys(keys); 
      return; 
     } 

     if (sortKeys.size() > 0 && columnHolder == column || firstTime) { 
      if(firstTime) { 
       firstTime = false; 
       columnHolder = column; 
       if(column != sortKeys.get(0).getColumn()) { 
        List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
        keys.set(0, new SortKey(column, SortOrder.ASCENDING)); 
        setSortKeys(keys); 
        return; 
       } 
      } 

      List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
      keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder()))); 
      setSortKeys(keys); 
      return; 
     } else if(sortKeys.size() > 0 && columnHolder != column && !firstTime) { 
      List<SortKey> keys = new ArrayList<SortKey>(getSortKeys()); 
      keys.set(0, new SortKey(column, SortOrder.ASCENDING)); 
      setSortKeys(keys); 
      columnHolder = column; 
      return; 
     } 
     super.toggleSortOrder(column); 
    } 

    private SortOrder setNextOrder(SortOrder order) { 
     switch (order) { 
      case ASCENDING: 
       return SortOrder.DESCENDING; 
      case DESCENDING: 
       return SortOrder.UNSORTED; 
      case UNSORTED: 
       return SortOrder.ASCENDING; 
      default: 
       return SortOrder.UNSORTED; 
     } 
    } 
}