2014-01-10 78 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