2014-02-14 41 views
1

在向JTable添加新行后。写入的信息发送到txt文件,但我的JTable未显示最后一个原始数据。但是,如果我关闭程序并再次运行它的信息,它就在表格中。那么,有没有办法刷新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<TableModel> sorter = new TableRowSorter<TableModel>(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)); 
     } 
    } 
}); 
+1

听起来就像在其上具有表格的组件上对validate()或revalidate()进行验证的经典案例。 –

+0

您究竟在哪里尝试添加行。我没有在你的代码中看到它。 –

+0

当我按下按钮时,会打开一个新窗口,然后输入新行所需的数据。它是一个子类中的单独JPanel。在两个通道之间没有直接连接 – user3307020

回答

1

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

+0

+1相当正确,但不好描述 – mKorbel

+0

我会向您澄清要执行的步骤,当您向jtable中添加一行时,实际上您正在将行添加到您的txt文件中,从你的文件中获取数据,然后将它添加到两维的对象,所以你必须重复你的第一个代码才能获得新闻对象[] [],然后用这个方法将对象添加到模型中: model.setDataVector(数据,标题); 然后将你的模型添加到你的jtable作为波纹管 jtable1.setmodel(model); 只需按照代码 –

0

使用此代码。

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的末尾添加一行。我的代码与数据库直接合作..

谢谢..

+0

的逻辑就可以了,不要以为我在挑剔你,因为我不是。但这个问题与数据库无关。数据正在从文件中读取。它有助于在回答之前阅读问题(而不仅仅是标题)。我自己有时犯这个错误:) –

+0

@peeskillet:没有人它真的没关系,但是我在发布代码之前给出了我的答案..这就是为什么我在显示他的代码后添加了“我的代码直接与你的数据库一起工作......”的原因。 。 –

+0

这个DefaultTableModel + JTable没有被添加到容器,那么永远不会被看到,OP想要重新加载模型(创建一个新模型并添加到JTable)到已经可见的JTable – mKorbel

2

看起来你认为什么是文件更新时,使应JTable。它不这样工作。你需要做的是在TableModel上添加一行。你的情况的一个缺点是这种

TableModel model = new DefaultTableModel( data, columns) 

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

DefaultTableModel model = new DefaultTableModel( data, columns) 

然后你可以使用以下方法之一从DefaultTableModel

所以,当你想添加一行,您可以收集你的数据到一个数组,然后addRow(..)表将得到自动更新为您服务。

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

此外它在我看来像你的JTable是本地作用域。您可能想给它一个全局的类成员范围,以便您可以从任何需要的地方访问它。

0

的为什么你在代码中使用TableRowSorter还顺便说一句,你为什么不使用只是JTable中和defaultmodel直接

+0

,因为我使用过滤功能 – user3307020

0

最近我有同样的问题和解决办法是打电话

model.fireTableDataChanged(); 

在将新行添加到模型之后。

我的问题如下:我有一张桌子,我允许排序。如果不点击列标题以便行可以相应地排序,我可以将数据添加到模型中,并通过调用table.revalidate();来查看表中的更改。但是,如果在任何时候点击列标题,则随后添加的任何行将不会显示,但模型数据正确更新。在将数据添加到模型之后,只需调用model.fireTableDataChanged();即可发挥魅力。