[英]how to make my JTable refresh after adding a new row
在我向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<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));
}
}
});
看起来你认为当文件更新时, 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();
将数据添加到模型后,它可以作为一个魅力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.