我使用ArrayList中包含的数据创建JTable,然后将JTable添加到JScrollPane
Test(const Test &ob) : Test(ob.a, ob.p[0], ob.p[1])
{
cout<<"\n\n "<<this->a<<" "<<this->p[0]<<" "<<this->p[1];
}
然后通过JButton我修改了ArrayList的内容,然后告诉TableModel已经进行了更改,然后重新验证()和重绘()JTable
ArrayList<Product> stock = new ArrayList<Product>(s);
String[] col = {"Nombre", "Cantidad", "Descripci\u00F3n", "Contenido"};
DefaultTableModel tableModel = new DefaultTableModel(col,0);
JTable table = new JTable(tableModel);
Collections.sort(stock, new Comparator<Product>() {
public int compare(Product p1, Product p2) {
return p1.getNombre().compareTo(p2.getNombre());
}
});
for (int i = 0; i < stock.size(); i++){
String nombre = stock.get(i).getNombre();
String cantidad = stock.get(i).getCantidad();
String descripcion = stock.get(i).getDescripcion();
String contenido = stock.get(i).getContenido();
Object[] data = {nombre, cantidad, descripcion, contenido};
tableModel.addRow(data);
}
table.getColumnModel().getColumn(0).setPreferredWidth(width*3/18);
table.getColumnModel().getColumn(1).setPreferredWidth(width/9);
table.getColumnModel().getColumn(2).setPreferredWidth(width*8/18);
table.getColumnModel().getColumn(3).setPreferredWidth(width/9);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
table.getTableHeader().setFont(new Font("Arial", Font.BOLD, f));
table.setFont(new Font("Arial", Font.PLAIN, f));
table.setBounds(1, 1, width*8/9, height);
table.setRowHeight(height/30);
table.setEnabled(false);
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
for(int i = 0; i<4; i++){
table.getColumnModel().getColumn(i).setCellRenderer( centerRenderer);
}
JScrollPane sp = new JScrollPane(table);
frame.getContentPane().add(sp, BorderLayout.CENTER);
问题是JTable不会更新,但信息确实在ArrayList中发生了变化
答案 0 :(得分:2)
JTable的数据不保存在ArrayList中,而是驻留在表模型本身中。结论:不要更新ArrayList,而是更新表模型本身,这里是DefaultTableModel,然后你的JTable应该显示新数据。幸运的是,这应该很容易,因为表模型具有允许您使用getValueAt(...)
提取数据的方法,并使用setValueAt(...)
更新其单元格中的值以及addRow(...)
(如果需要新行)待补充。
请注意,如果您通过DefaultTableModel进行更改,则无需直接调用fireTableDataChanged()
,实际上您不应该调用此方法 - 它是模型和&#39} #39;这样做的责任。同样地,您无需{JTID revalidate()
或repaint()
。
请查看DefaultTableModel API了解详细信息。
另一方面,如果您绝对需要使用ArrayList作为JTable的数据核心,那么您不应该使用DefaultTableModel,而是通过扩展AbstractTableModel并使用ArrayList作为其数据核来创建自己的TableModel 。如果您这样做,那么在更改模型的状态后,您的模型代码应该注意调用相应的fire...(...)
方法。