JTable 行中重複值
使用自訂 DataModel 填充 JTable 有時可能會導致表格行中意外出現重複資料。雖然這可能表明 DataModel 存在問題,但仔細檢查通常會發現其他問題,從而使此行為的原因成為一個謎。
這種現象的一個可能解釋在於 JTable 本身的實作。當使用 DataModel 填入 JTable 時,表中呈現的值直接從 DataModel 的 getValueAt 方法派生。如果此方法無法正確檢索表中每個單元格的唯一值,則呈現的值將在多行中重複。
要解決此問題,必須確保 getValueAt 方法始終傳回每個單元格的預期值。這可以透過正確填充 DataModel 使用的底層資料結構來實現。對於提供的 DataModel,populate 方法會用資料行填入資料 ArrayList。但是,如果填入此 ArrayList 的程式碼未正確為每一行指派唯一值,則結果表將顯示重複值。
提醒一下,僅修改 getValueAt 方法以傳回不同的值是不夠的值,因為這不會修正根本問題。相反,重點應該是確保用於填充 DataModel 的資料結構從一開始就包含正確的資料。透過尋址資料來源,可以防止 JTable 中出現重複值。
要提供更具體的範例,請考慮以下程式碼片段:
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class CollectionDataModel extends AbstractTableModel { private ArrayList<ArrayList<String>> data; public CollectionDataModel() { data = new ArrayList<ArrayList<String>>(); } @Override public int getColumnCount() { if (data.isEmpty()) return 0; return data.get(0).size(); } @Override public int getRowCount() { return data.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (rowIndex >= getRowCount()) return null; if (columnIndex >= getColumnCount()) return null; return data.get(rowIndex).get(columnIndex); } public void populate(Collection c) { data.clear(); for (Item i : c.getItems()) { ArrayList<String> row = new ArrayList<String>(); for (Property p : i.getProperties().values()) { row.add(p.toString()); } data.add(row); } fireTableDataChanged(); } }
在此程式碼中,populate 方法將從 Collection 物件取得的資料行填入資料 ArrayList。為了避免 JTable 中出現重複值,請確保 ArrayList 中的每一行都包含唯一的資料至關重要。這可以透過在向 ArrayList 添加新行之前檢查是否存在重複資料或使用強制唯一性的資料結構來實現。
透過直接定址資料來源,可以防止重複值出現在 JTable 中。這種方法比操作 getValueAt 方法更可靠、更有效率,因為它從一開始就確保基礎資料是準確的。
以上是使用自訂 DataModel 時,為什麼我的 JTable 行會顯示重複值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!