从文本文件将数据导入JTable

时间:2019-07-29 10:06:27

标签: java swing

我有一个已经创建的JTable,我想在其中插入文本文件中的数据。我不想创建另一个新的JTable,而是将数据插入正确的行和列中。

我所有目的是在退出应用程序之前保存JTable数据,并在重新打开应用程序后保存数据。在退出之前,我设法将JTable数据导出到文本文件,但是当我从文本文件导入时,数据不会显示。

这是我导出到文本文件中的代码:

for循环中的if语句用于检查JTable字段是否为空。

public void serializeData() {
   try {
        BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Users\\X\\Documents\\NetBeansProjects\\JavaApplication1\\data.txt"));
        for (int i = 1; i < dataTable.getRowCount(); i++) {
            for (int j = 1; j < dataTable.getColumnCount(); j++) {
                if (dataTable.getValueAt(i, j) != null) {
                    writer.write(dataTable.getValueAt(i, j).toString() + " ");
                } else {
                    writer.write(0);
                }
            }
           writer.write("\n");
        }

        writer.close();
        System.out.printf("Serialized data is saved in /tmp/employee.ser");
    } catch (IOException i) {
        JOptionPane.showMessageDialog(null, "File not found");
    }
}

这是我要从文本文件导入的代码:

在导入时,我只想导入文本文件中的数字,否则,我想将该字段设置为空。

String filepath = "C:\\Users\\X\\Documents\\NetBeansProjects\\JavaApplication1\\data.txt";
File file = new File(filepath);

 try {
    BufferedReader reader = new BufferedReader(new FileReader(file));
    DefaultTableModel tableModel = (DefaultTableModel) dataTable.getModel();
    Object[] lines = reader.lines().toArray();

    for(int i = 1; i<lines.length-1; i++) {
        String[] row = lines[i].toString().split(" ");
        for(int j = 1; j<row.length; j++) {
            if(row[i].equals(" ")) {
                dataTable.setValueAt(null, i, j);
            } else {
                dataTable.setValueAt(Double.parseDouble(row[j]), i, j);
            }
        }
    }

} catch(Exception ex) {
  JOptionPane.showMessageDialog(null, "Error");
}

当我尝试从文本文件导入数据时,JTable中什么也没有出现。 我该如何解决?

2 个答案:

答案 0 :(得分:0)

        if(row[i].equals(" ")) {
            dataTable.setValueAt(null, i, j);
        } else {
            dataTable.setValueAt(Double.parseDouble(row[j]), i, j);
        }

您的基本逻辑是错误的。如果要导入数据,则意味着您应该从“空”模型开始。因此,您需要在解析文件中的每一行时添加数据。

所以逻辑应该类似于:

if(row[i].equals(" ")) {
    row[i] = null;
} else {
    row[i] = Double.parseDouble(row[i]);
}

tableModel.addRow( row );

答案 1 :(得分:-2)

更新数据后,在表模型上调用fireTableStructureChanged。