2009-01-19 66 views
0

我正在尋找一個previous question的答案,並有一個巧妙的想法來克服JTable的限制。我需要編輯器在逐行基礎上有所不同,而JTable只能爲每列處理單個編輯器。刷新setCellEditor for JTable

所以我的想法是使用MouseListener來檢查JTable上的行和列,並且每次都設置新的編輯器。

但是,第二次打電話setCellEditor()沒有任何影響。編輯仍然是第一個被設定的人。那麼我怎麼才能讓「setCellEditor」再次爲同一列工作?

以下是MouseListener中的代碼。

public void mouseClicked(MouseEvent e) { 
    int cols = resultTable.columnAtPoint(new Point(e.getX(), e.getY())); 
    int rows = resultTable.rowAtPoint(new Point(e.getX(), e.getY())); 
    StorageObject item = (StorageObject) resultTable.getModel().getValueAt(rows, cols); 
    TableColumn col = resultTable.getColumnModel().getColumn(cols); 
    col.setCellEditor(new MyComboBoxEditor(item.list)); 
} 

回答

3

我不知道爲什麼你的代碼不能正常工作(它已經有一段時間,因爲我做的Swing),但你爲什麼不只是覆蓋

public TableCellEditor getCellEditor(int row, int column) 

在您的JTable?維護您想要用於每行的組合框的地圖,並在您的覆蓋方法中返回正確的地圖。

+0

是的。這是如何處理單個列的多種編輯器類型。 – 2009-01-19 17:12:01

1

我的理論是,當所有的鼠標偵聽登記表/ TableCell的調用,安裝到系統默認的API類的將被首先調用,您的鼠標監聽之前。這意味着導致編輯器被提取的事件將在您將其設置爲另一個之前發生。有點像競賽條件,只是它實際上在API源代碼的某處定義...這是我的天真理論,我已經可以看到一些漏洞,所以對我的解決方案:

覆蓋JTable.getCellEditor(int row, int col)。這使您可以將任何編輯器返回給任何單元格。