2011-02-04 239 views
2

我有一個簡單的Swing JTable和TableRowSorter由我製作。但是,我會排除排序中的第一列,因爲我想保留它以顯示行號。 我看不出找到任何東西,除了從JTable排序列排除

sorter.setSortable(0, false); 

這使得該列不點擊,但仍然排序單擊另一列時... 這麼快的問題將是:如何從被保持柱由TableRowSorter分揀機?

謝謝!

回答

4

因此,使用JTable(如下)在列A上排序會產生以下結果。但是,您希望數據進行排序,但不是行號,對嗎?

|row| column A |  |row| column A | 
+---+-----------+  +---+-----------+ 
| 1 | blah blah | --> | 1 | blah blah | 
| 2 | something |  | 3 | more blah | 
| 3 | more blah |  | 2 | something | 

我將與TableCellRenderer接近此爲0列,關鍵是要忽略傳入的值,而使用該行參數。

public class RowRenderer extends JLabel implements TableCellRenderer { 
    public Component getTableCellRendererComponent(JTable table, Object color, 
     boolean isSelected, boolean hasFocus, int row, int column) { 
     setText(Integer.toString(row)); 
     return this; 
    } 
} 

注:如果你正在你的分頁表(即模型不包含所有行的;例如,僅排100-200),就需要告知量的單元格渲染器添加以row獲取要顯示的行號。

1

JTable是圍繞顯示數據行而不是數據單元而設計的,所以實際上不可能防止按照您的說法排列單個列。相反,我會嘗試修改您的TableModel返回的行索引值在該列:

@Override public Object getValueAt(int rowIndex, int columnIndex) { 
    if (columnIndex == 0) return rowIndex; 
    else { 
     // handle other columns 
    } 
} 

如果不工作,你也可以嘗試修改表單元格渲染器使用表的行號代替。

+0

感謝您的回答:-)我已經按照您的說法實施了getValueAt(),但是當單擊其他列時,該列仍可排序。我將嘗試使用表格單元格渲染器。 – 2011-02-04 16:46:47

+0

第二個想法奏效,謝謝。只需在不想排序的TableColumn上執行setCellRenderer,然後創建一個TableCellRenderer,其值爲value = rowIndex + 1; – 2011-02-04 17:06:03

0

如果行號不是數據的一部分,那麼它不應該存儲在模型中。

相反,我會使用顯示行號的行標題。像你這樣的東西會在Excel中看到。你可以使用這個Row Number Table