我想知道如何實現(xiàn)這種行為,當該行的特定列中的值更改為某個固定值時,這將讓我從 JTable 中刪除行。我嘗試使用 TableModelListener 來做到這一點,但沒有預期的效果。我的問題與這樣一個事實有關,當我在處理 UPDATE TableModelEvent 的同時修改模型時,我譴責自己處理可能修改的模型(事件源)與事件本身之間的不一致。換句話說,可以根據(jù)表模型的不同狀態(tài)生成事件。void onTableChanged(TableModelEvent tableModelEvent){ MyTableModel model = (MyTableModel)e.getSource(); if ( e.getType() == TableModelEvent.UPDATE){ MyObject myObject = (MyObject)model.getValueAt(e.getFirstRow(), e.getColumn()); if ( myObject.getSomeProperty().equals("DELETE ME")){ model.removeRow(e.getFirstRow()); // does it look like asking for troubles? } }}現(xiàn)在想象一下,我們有一個方法可以讓我們一次更新多行。class MyObject { private String someProperty; //...getters/setters}class MyTableModel extends AbstractTableModel { private static int SOME_PROPERTY_COL = 1; private final List<MyObject> data; public MyTableModel(List<MyObject> data) { this.data = data; } //... void update(int[] modelIndices, String newSomePropertValue) { for (int i = 0; i < modelIndices.length; i++){ data[modelIndices[i]].setSomeProperty(newSomePropertyValue); fireCellUpdated(modelIndices[i], SOME_PROPERTY_COL); } }}在 TableModelEvent 中的 rowIndex、colIndex 與第二時間的模型狀態(tài)以及由于調(diào)用 MyTableModel 對象上的 update(int[], String) 方法而接收到的后續(xù)事件之間的這種實現(xiàn)中存在不一致。我相信問題來自這樣一個事實,我嘗試在接收基于此源的某些特定狀態(tài)生成的事件時修改事件源,但這也不是問題,例如,如果指示模式更改的任何事件是與模型修改交錯,以及基于模型舊狀態(tài)生成的其他一些事件?我最終想要實現(xiàn)的是實現(xiàn),它可以讓我根據(jù)表中某列中的值將行從一個表移動到另一個表。所以想象一個單元格是一個組合框,有 2 個值,我們有兩個表,當一個單元格中的值更改為 table1 時,行將從當前表轉移到 table1。我認為使用 TableModelListener 將是正確的解決方案,但我可以看到在此方法中修改模型不是一個好主意,不是嗎?
1 回答

波斯汪
TA貢獻1811條經(jīng)驗 獲得超4個贊
model.removeRow(e.getFirstRow()); // does it look like asking for troubles?
將代碼包裝在一個SwingUtilities.invokeLater(...).
現(xiàn)在將代碼添加到事件調(diào)度線程(EDT)的末尾,以便在行刪除完成之前表處理和表模型偵聽器處理可以正常完成。
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
model.removeRow(e.getFirstRow());
}
});
此外,在您的update()方法中,您需要以反向模型行順序更新模型的數(shù)據(jù)。這樣,當您刪除行時,索引不正確就沒有問題。
添加回答
舉報
0/150
提交
取消