2010-07-05 113 views
79

这是我的JTableJTable如何在插入删除或更新数据后刷新表模型。

private JTable getJTable() { 
    String[] colName = { "Name", "Email", "Contact No. 1", "Contact No. 2", 
      "Group", "" }; 
    if (jTable == null) { 
     jTable = new JTable() { 
      public boolean isCellEditable(int nRow, int nCol) { 
       return false; 
      } 
     }; 
    } 
    DefaultTableModel contactTableModel = (DefaultTableModel) jTable 
      .getModel(); 
    contactTableModel.setColumnIdentifiers(colName); 
    jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    return jTable; 
} 

我会调用这个方法从数据库中检索数据,并把它放入台式

public void setUpTableData() { 
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); 
    ArrayList<Contact> list = new ArrayList<Contact>(); 
    if (!con.equals("")) 
     list = sql.getContactListsByGroup(con); 
    else 
     list = sql.getContactLists(); 
    for (int i = 0; i < list.size(); i++) { 
     String[] data = new String[7]; 

      data[0] = list.get(i).getName(); 
      data[1] = list.get(i).getEmail(); 
      data[2] = list.get(i).getPhone1(); 
      data[3] = list.get(i).getPhone2(); 
      data[4] = list.get(i).getGroup(); 
      data[5] = list.get(i).getId(); 

     tableModel.addRow(data); 
    } 
    jTable.setModel(tableModel); 
} 

目前我就是用这个方法来刷新表更新后表数据。我将首先清除表格

DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); 
tableModel.setRowCount(0); 

然后再次重构表模型,以便刷新jTable。但我在想有没有最佳做法或更好的方法来做到这一点?

回答

101

如果你想通知你JTable有关数据的更改,请使用
tableModel.fireTableDataChanged()

documentation

通知,在表中的所有行单元格值可能已改变了所有的听众。行数也可能已更改,JTable应从头开始重新绘制表。表格的结构(按照列的顺序)假定是相同的。

+0

你的意思我每次更新时都会调用这个tableModel.fireTableDataChanged()? – user236501 2010-07-05 11:57:16

+3

@ newbie123:如果只插入新行,则可以使用[fireTableRowsInserted](http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableRowsInserted% 28int,%20int%29)。另一方面,'DefaultTableModel.addRow'的实现应该已经可以处理...不是用'addRow'刷新表吗? – 2010-07-05 11:59:39

+0

我正在使用addRow它的作品,但如何更新? – user236501 2010-07-05 12:24:47

-2

我在我的Jtable中做了这样的事情,它在300 ms后自动更新消息;

DefaultTableModel tableModel = new DefaultTableModel(){ 
public boolean isCellEditable(int nRow, int nCol) { 
       return false; 
      } 
}; 
JTable table = new JTable(); 

Timer t = new Timer(300, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       addColumns(); 
       remakeData(set); 
       table.setModel(model); 
      } 
     }); 
     t.start(); 

private void addColumns() { 
     model.setColumnCount(0); 
     model.addColumn("NAME"); 
      model.addColumn("EMAIL");} 

private void remakeData(CollectionType<Objects> name) { 
    model.setRowCount(0); 
    for (CollectionType Objects : name){ 
    String n = Object.getName(); 
    String e = Object.getEmail(); 
    model.insertRow(model.getRowCount(),new Object[] { n,e }); 
    }} 

我怀疑它会做的好有大量像500的对象,只是另一种方式是在你的类实现TableModelListener,但我不知道如何使用它做好。看看http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

1

使用java.util.Observablejava.util.Observer会导致表更新会不会更好?

+5

不是,当然不是,不这样做,为什么模拟JTable的内置选项和出自EDT – mKorbel 2011-10-16 12:10:55

16

您的情况下,更快的方法是:

jTable.repaint(); // Repaint all the component (all Cells). 

优化的方式,当一个或几个小区改变:

((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell. 
+1

我实际上发现jTable .invalidate()是实际强制重绘的方法。 – 2013-06-06 18:36:39

+0

没错,但验证方法是布局过程的一部分,也会影响容器的父母。因此,如果您需要重做布局,请使用它。 http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#invalidate() – 2013-06-07 01:23:26

2
DefaultTableModel dm = (DefaultTableModel)table.getModel(); 
dm.fireTableDataChanged(); // notifies the JTable that the model has changed 
+3

不,不... DefaultTableModel已实现此事件,并正确实施... – mKorbel 2012-08-21 10:50:15

5

试试这个

public void setUpTableData() { 
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); 

    /** 
    * additional code. 
    **/ 
    tableModel.setRowCount(0); 
    /**/ 
    ArrayList<Contact> list = new ArrayList<Contact>(); 
    if (!con.equals("")) 
     list = sql.getContactListsByGroup(con); 
    else 
     list = sql.getContactLists(); 
    for (int i = 0; i < list.size(); i++) { 
     String[] data = new String[7]; 

     data[0] = list.get(i).getName(); 
     data[1] = list.get(i).getEmail(); 
     data[2] = list.get(i).getPhone1(); 
     data[3] = list.get(i).getPhone2(); 
     data[4] = list.get(i).getGroup(); 
     data[5] = list.get(i).getId(); 

     tableModel.addRow(data); 
    } 
    jTable.setModel(tableModel); 
    /** 
    * additional code. 
    **/ 
    tableModel.fireTableDataChanged(); 
    /**/ 
} 
+2

您最后不需要jTable.setModel(tableModel),因为您已经在开始时获得了Table的模型。 – 2014-05-13 08:18:35

相关问题