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中文网其他相关文章!