无法更新JTable的信息

时间:2016-09-29 16:53:42

标签: java swing arraylist jtable

我使用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中发生了变化

1 个答案:

答案 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...(...)方法。