行中的JTable重复值
我有一个JTable
填充了一个自定义的DataModel
(粘贴在下面),当我调用populate()
方法时,它似乎用重复的数据填充表 – 每行一遍又一遍地填充相同的值。 然而,通过仔细检查(通过println()数据字段),数据模型没有错误 – 它保存着我所期望的格式的正确数据。 是什么赋予了?
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; @SuppressWarnings("serial") // we don't expect this app to ever use serialized classes. EVER. 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(); } }
这是一个完整的例子,可能会有帮助。 由于示例Map
是不可修改的,因此我将@MKorbel的示例介绍如何覆盖isCellEditable()
和setValueAt()
。
import java.awt.EventQueue; import java.awt.GridLayout; import java.util.Map; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; /** @see https://stackoverflow.com/questions/9132987 */ public class EnvTableTest extends JPanel { public EnvTableTest() { this.setLayout(new GridLayout()); this.add(new JScrollPane(new JTable(new EnvDataModel()))); } private static class EnvDataModel extends AbstractTableModel { private Map<String, String> data = System.getenv(); private String[] keys; public EnvDataModel() { keys = data.keySet().toArray(new String[data.size()]); } @Override public String getColumnName(int col) { if (col == 0) { return "Key"; } else { return "Value"; } } @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return data.size(); } @Override public Object getValueAt(int row, int col) { if (col == 0) { return keys[row]; } else { return data.get(keys[row]); } } } private void display() { JFrame f = new JFrame("EnvTableTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new EnvTableTest().display(); } }); } }
你可以尝试使填充更改primefaces。
public void populate(Collection c) { ArrayList<ArrayList<String>> data2 = new ArrayList<ArrayList<String>>(); for(Item i : c.getItems()) { ArrayList<String> row = new ArrayList<String>(); for(Property p : i.getProperties().values()) { row.add(p.toString()); } data2.add(row); } data = data2; fireTableDataChanged(); }
我猜测在先前的populate
调用完成之前再次调用populate
。 可能c
在迭代过程中发生了变化。
1)您的TableModel
是un_completed,我错过了很多或JTable's
life_cycle所需的方法,从TableHeader等开始
2)由于有很多基于HashMap的AbstactTableModel,我build议直接返回在API中实现的数组types
Vector<Vector<Object or String>> data; String[][] or Object[][]
代替
ArrayList<ArrayList<String>> data;
简单的解释是XxxList返回列和Vector或String []返回行
3)我build议直接使用DefaultTableModel
,那么你永远不需要解决重复或错过列/行