2014-03-13 33 views
5

我有一個JXtable。我想阻止排序前3行。基本上前3行應該總是在最上面,其餘的應該根據它們的價值進行排序。防止在jxtable中排序前3行

關於被如此類似的問題,但我不知道如何真正將其應用到我的使用 Sort ROW except last row

的主要區別是,我使用JXTable。有沒有一個簡單的方法來做到這一點,我失蹤了?

這裏是我的JXtable代碼

jTable1 = new JXTable(); 
if (isClickable) { 
    jTable1.getTableHeader().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 

    //set the sorter here 
} else { 
    jTable1.setSortable(false); 
} 
+0

http://stackoverflow.com/questions/11665397/jtable-multiple-header-rows –

+0

如果該鏈接適用不知道。這是指頭的分組。任何評論爲什麼你認爲它的相似或任何特定的部分,我應該重讀? – codeNinja

+0

我認爲有多行標題可能就像在排序時修正了頂行。 _謝謝,下次再精心準備._ –

回答

1

嗯,我花了一些時間來盡我所能完善這一點,但這裏是我的工作的例子。

基本上,我做了一個名爲ComparableWrapper的包裝類,它實現了Comparable,因此每列的排序都可以被操縱。對於表模型,我添加了一個setData(Object[][] data)方法,該方法自動將所有數據值包裝在ComparableWrapper中。 ComparableWrapper構造函數中的sorted參數確定值是否應按正常順序排序,或者無論如何都保留在頂部。

您必須在幾個位置手動更改列的類類型。總之,這裏是我的SSCCE:

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.table.AbstractTableModel; 
import org.jdesktop.swingx.JXTable; 

public class TableTest extends JFrame { 

    public TableTest() { 
     super("JXTable - first 3 rows aren't sorted"); 
     setLayout(new BorderLayout()); 

     MyTableModel model = new MyTableModel(); 
     JXTable table = new JXTable(); 
     table.setModel(model); 

     Object[][] initialData = { 
      {"Zoe", new Integer(26)}, 
      {"Adam", new Integer(29)}, 
      {"Trisha", new Integer(33)}, 
      {"Reed", new Integer(20)}, 
      {"John", new Integer(3)}, 
      {"Kyle", new Integer(102)}, 
      {"Billy Bob", new Integer(27)}, 
      {"Sandra", new Integer(87)}, 
      {"Steve", new Integer(50)}, 
      {"Guy", new Integer(23)}, 
      {"Kenzie", new Integer(25)}, 
      {"Mary", new Integer(27)}, 
      {"Sally", new Integer(12)}, 
      {"Joe", new Integer(101)}, 
      {"Billy", new Integer(44)}, 
      {"Bob", new Integer(83)}, 
     }; 
     model.setData(initialData); 

     JScrollPane tableScroll = new JScrollPane(table); 
     add(tableScroll, BorderLayout.CENTER); 

     table.setFillsViewportHeight(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400, 600); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 

    private class MyTableModel extends AbstractTableModel { 

     String[] columns = { "First Name", "Age" }; 
     Object[][] data = {}; 

     public void setData(Object[][] data) { 
      for (int i=0; i<data.length; i++) { 
       // Don't sort top 3 rows 
       boolean sorted = i < 3 ? false : true; 

       // Wrap each object so the sorting can be manipulated. 
       // Change these class types as needed. 
       data[i][0] = new ComparableWrapper<String>((String) data[i][0], sorted); 
       data[i][1] = new ComparableWrapper<Integer>((Integer) data[i][1], sorted); 
      } 
      this.data = data; 
      fireTableDataChanged(); 
     } 

     @Override 
     public Class<?> getColumnClass(int col) { 
      return ComparableWrapper.class; 
     } 

     @Override 
     public int getColumnCount() { 
      return columns.length; 
     } 

     @Override 
     public int getRowCount() { 
      return data.length; 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      return data[row][col]; 
     } 

     @Override 
     public String getColumnName(int col) { 
      return columns[col]; 
     } 

    } 

    private class ComparableWrapper<T> implements Comparable<ComparableWrapper<T>> { 

     private Comparable<T> object; 
     private boolean sorted; 

     public ComparableWrapper(Comparable<T> object, boolean sorted) { 
      this.object = object; 
      this.sorted = sorted; 
     } 

     @Override 
     public int compareTo(ComparableWrapper<T> o) { 
      if (object instanceof Comparable<?>) { 
       if (sorted && o.isSorted()) { 
        // Sort normally by default 
        return object.compareTo(o.getObject()); 
       } else { 
        // If an un-sorted row is being compared, don't compare at all 
        return 0; 
       } 
      } 

      // Fallback 
      return 0; 
     } 

     public T getObject() { 
      return (T) object; 
     } 

     public boolean isSorted() { 
      return sorted; 
     } 

     @Override 
     public String toString() { 
      return object.toString(); 
     } 

    } 

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

} 
+0

當我運行這個沒有數據被添加到jxtable。 – codeNinja

+0

@codeNinja對不起,我忘了將'fireTableDataChanged();'添加到表模型上的'setData'方法。這樣它會通知表格數據已更新。我已經更新了我的答案。 – uyuyuy99

+0

'fireTableDataChanged'填充了表格。現在,當我點擊名稱的頭部時,出現以下錯誤:線程中的異常「AWT-EventQueue-0」java.lang.ClassCastException:javaapplication4.JavaApplication4 $ ComparableWrapper無法轉換爲java.lang.String' – codeNinja