当对象发生变化时,在JTable中更新数据

时间:2015-01-25 16:14:10

标签: java swing jtable

假设我有这个JTable:

 private JScrollPane scrollPane1;
  private JTable table;
  private DefaultTableModel model;

  DefaultTableModel model = new DefaultTableModel();
  model.addColumn("Item");
  model.addColumn("ID");
  model.addColumn("Price");
  model.addColumn("Category");

  this.scrollPane1 = new JScrollPane();
  this.scrollPane1.setBounds(33, 518, 604, 300);
  this.contentPane.add(this.scrollPane1);
  table = new JTable(model);
  this.scrollPane1.setViewportView(table);

我有一个Item类,所以当我创建一个Item的新实例时,我将项目信息添加到JTable:

Item item = new Item("Shovel", 1, 123, "Tools");
model.addRow(new Object[]{item.getItem(), item.getID(), item.getPrice(), item.getCategory()});

到目前为止一切顺利。 但是,如果我更新项目,例如将价格从5更改为10,则不会在JTable中更新。所以如果我做的话:

item.setPrice(10);

它在JTable中没有更新。我试过调用model.fireTableDataChanged();和table.repaint();但它们都不起作用。看起来单元格中的值与对象值无关?我该怎么做? (第一次使用JTables。)

有什么建议吗?不要被缺乏方法等困扰,我只是快速地把这个放在一起。 编辑:我的项目对象存储在HashMap中。

1 个答案:

答案 0 :(得分:0)

实际上,您没有修改表格中的任何单元格,item对象没有直接与您的表格关联,您使用item中的相同值在表格中创建了一个现在的值对象

您需要做的是更新单元格本身,然后从AbstractTableModel类重写以下方法:

@Override
public void setValueAt(Object value, int row, int col) { //

然后致电

model.fireTableDataChanged();