2014-01-10 35 views
2

我有2 JTables,一個用於顯示的行和一個用於顯示數據:禁用的JTable RowSorter的用於HeaderView

enter image description here

問題:當所述數據表進行排序,也行排序:

enter image description here

是否有可能使「RowHeaderView」表沒有得到整理,如數據表?

public class SimpleJTableHeader extends JFrame { 

    public JTable table; 

    public SimpleJTableHeader() { 

     // CREATE A JTABLE 
     Object rowData[][] = { { "a" }, { "b" }, { "c" }, { "d" } }; 
     Object columnNames[] = { "1" }; 
     table = new JTable(rowData, columnNames); 
     table.setRowHeight(20); 
     table.setAutoCreateRowSorter(true); 

     JScrollPane scrollPane = new JScrollPane(table); 

     // ADD ROW NUMBERS TO THE TABLE 
     scrollPane.setRowHeaderView(getHeaderTable()); 

     // SHOW TABLE 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(scrollPane, BorderLayout.CENTER); 
     frame.setSize(300, 150); 
     frame.setVisible(true); 
    } 

    public JTable getHeaderTable() { 
     final AbstractTableModel model = new AbstractTableModel() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public int getColumnCount() { 
       return 1; 
      } 

      @Override 
      public Object getValueAt(int row, int column) { 
       return table.convertRowIndexToModel(row); 
      } 

      @Override 
      public int getRowCount() { 
       return table.getRowCount(); 
      } 
     }; 
     JTable headerTable = new JTable(model); 
     headerTable.setPreferredScrollableViewportSize(new Dimension(40, 0)); 
     headerTable.setRowHeight(20); 
     return headerTable; 
    } 

    public static void main(String args[]) { 
     new SimpleJTableHeader(); 
    } 
} 
+2

_don't_的轉換的rowIndex在getValueAt的頭部模型 – kleopatra

+1

回報'row'表模型,而不是轉換值。 – alex2410

+0

+1 for SSCCE/MCVE – mKorbel

回答

-1

由於mKorbel新的正確getHeaderTable方法:

public JTable getHeaderTable() { 
    DefaultTableModel model = new DefaultTableModel() { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public int getColumnCount() { 
      return 1; 
     } 

     @Override 
     public boolean isCellEditable(int row, int col) { 
      return false; 
     } 

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

     @Override 
     public Class<?> getColumnClass(int colNum) { 
      switch (colNum) { 
      case 0: 
       return String.class; 
      default: 
       return super.getColumnClass(colNum); 
      } 
     } 
    }; 

    JTable headerTable = new JTable(model); 
    for (int i = 0; i < table.getRowCount(); i++) { 
     headerTable.setValueAt((i + 1), i, 0); 
    } 
    headerTable.setPreferredScrollableViewportSize(new Dimension(40, 0)); 
    headerTable.setRowHeight(20); 
    return headerTable; 
} 
+0

你可以使用Jlist而不是2nd。 JTable用於RowHeader,限制是不可編輯的(可能是不需要的,我希望這個對象應該可編輯) – mKorbel

+1

呃......這太複雜了(除了不安全並且沒有真正同步到主表作爲@ mKorbel的例子):簡單地擴展AbstractTableModel(使其不受修改的影響)並返回_row_(或_row + 1_,就像你喜歡的)from getter – kleopatra

+0

@kleopatra好點的safe_mode_solution,但我認爲這個答案可以' t down_voted – mKorbel