如何在添加新行后进行JTable刷新

在我向JTable添加新行之后。 写入的信息转到txt文件,但我的JTable没有显示最后一个原始文件。 但是,如果我关闭程序并再次运行它,那么表中的信息就会出现。 那么,有没有办法刷新JTable的数据而不关闭应用程序并再次运行它?

 String[] columns = {"nume", "compozitie", "indicatii", "contraindicatii", "administrare", "pret", "compensabil", "stoc"}; Object[][] data = null; try { File file = new File("medicamente.txt"); FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); data = new Object[100][]; String line; int numLines = 0; while ((line = bufferedReader.readLine()) != null) { data[numLines] = line.split(","); numLines++; } fileReader.close(); } catch (IOException e) { e.printStackTrace(); } TableModel model = new DefaultTableModel(data, columns) { @Override public Class getColumnClass(int column) { Class returnValue; if ((column >= 0) && (column < getColumnCount())) { returnValue = getValueAt(0, column).getClass(); } else { returnValue = Object.class; } return returnValue; } }; JTable table = new JTable(model) { public boolean isCellEditable(int row, int column) { return false; } }; final TableRowSorter sorter = new TableRowSorter(model); table.setRowSorter(sorter); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setPreferredSize(new Dimension(1000, 500)); mainPanel.add(scrollPane); scrollPane.setBounds(0, 240, 995, 510); final JTextField filterText = new JTextField(null); mainPanel.add(filterText); filterText.setBounds(0, 750, 850, 25); JButton button = new JButton("Filter"); mainPanel.add(button); button.setBounds(850, 750, 150, 25); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String text = filterText.getText(); if (text.length() == 0) { sorter.setRowFilter(null); // model.fireTableDataChanged(); } else { sorter.setRowFilter(RowFilter.regexFilter(text)); } } }); 

看起来你认为当文件更新时, JTable 。 它不像那样工作。 您需要做的是向TableModel添加一行。 你的情况就是一个缺点

 TableModel model = new DefaultTableModel( data, columns) 

您正在使用TableModel接口,它可以使用非常有限的方法。 而是这样做

 DefaultTableModel model = new DefaultTableModel( data, columns) 

然后,您可以使用DefaultTableModel的这些方法之一

  • public void addRow(Object[] rowData) – 在模型末尾添加一行。 除非指定了rowData,否则新行将包含空值。 将生成要添加的行的通知。

  • public void addRow(Vector rowData) – 在模型末尾添加一行。 除非指定了rowData,否则新行将包含空值。 将生成要添加的行的通知。

因此,当您想要添加一行时,您可以将数据收集到一个数组中, addRow(..)然后该表将自动为您更新。

 Object[] row = { data1, data2, data2, data4, data5 }; DefaultTableModel model = (DefaultTableModel)table.getModel(); model.addRow(row); 

它也让我觉得你的JTable是本地范围的。 您可能希望为其提供全局的类成员范围,以便您可以从任何需要的位置访问它。

您必须将数据添加到jtable模型中,然后将模型添加到jtable中,它将被刷新,但在此之前您必须定义模型。

使用此代码。

 private void resetListData() throws ClassNotFoundException, SQLException { Connection cne = null; try { // create connection in this line as per your database like I used sqlite. so my connection string is as follow Class.forName("org.sqlite.JDBC"); cne = DriverManager.getConnection("jdbc:sqlite:table.sqlite"); cne.setAutoCommit(false); PreparedStatement psd = (PreparedStatement) cne.prepareStatement("Select * from table"); psd.execute(); ResultSet r = psd.getResultSet(); ResultSetMetaData rsmd = r.getMetaData(); int count = rsmd.getColumnCount(); String[] meta = new String[count]; for (int i = 0; i < count; i++) { String name = rsmd.getColumnName(i + 1); meta[i] = name; //System.out.println(name); } model = new DefaultTableModel(new Object[][]{}, new String[]{"name", "address"}); jTable1.setModel(model); while (r.next()) { Object[] row = new Object[count]; for (int i = 1; i <= count; ++i) { row[i - 1] = r.getString(i); // Or even rs.getObject() } model.addRow(row); } cne.close(); } catch (ClassNotFoundException | SQLException e) { } } 

根据您的需要创建连接和查询..我的代码在Jtable的末尾添加一行。 我的代码直接使用你的数据库..

谢谢..

顺便说一句,为什么你在代码中使用TableRowSorter,为什么你不直接使用jtable和defaultmodel

我最近有同样的问题,解决方案是打电话

 model.fireTableDataChanged(); 

将新行添加到模型后。

我的问题如下:我有一张桌子,我允许排序。 在没有单击列标题以便行相应排序的情况下,我能够通过调用table.revalidate();将数据添加到模型并查看表中的更改table.revalidate(); 但是,如果我在任何时候点击了列标题,那么之后添加的任何行都不会显示,尽管模型数据正在正确更新。 只调用model.fireTableDataChanged(); 将数据添加到模型后,它可以作为一个魅力。