java - 导入的数据仅显示在 JTable (Java) 的第一列中

标签 java swing jtable

我尝试制作一个简单的 GUI,可以在其中添加一个人的名字/姓氏及其出生日期。将数据添加到 JTable 后,我可以将其保存在 TxT 文件中,然后再次将其加载回 JTable 中。

保存数据的部分:

private void saveListener(){
    jb1.addActionListener(e -> {
        JFileChooser fileChooser = new JFileChooser();
        int returnVal = fileChooser.showSaveDialog(PeopleGUI.this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {     // Datei Explorer
            try {
                File file = fileChooser.getSelectedFile();
                PrintWriter o = new PrintWriter(file); // o steht für Output

                for (int col = 0; col < peopleModel.getColumnCount(); col++) {
                    o.print(peopleModel.getColumnName(col) + ";");
                }

                o.println("");

                for (int row = 0; row < peopleModel.getRowCount(); row++) {
                    for (int col = 0; col < peopleModel.getColumnCount(); col++) {
                        o.println(peopleModel.getValueAt(row, col));
                    }
                }

                o.close();
                // Output in der Konsole
                System.out.println("Success!");
            } catch (IOException c) {
                c.printStackTrace();
            }
        }
    });
}

加载数据的部分:

public void loadListener() {
    jb2.addActionListener(e -> {
    final JFileChooser fileChooser = new JFileChooser();
    int response = fileChooser.showOpenDialog(PeopleGUI.this);
    if (response == JFileChooser.APPROVE_OPTION) {
        try {
            BufferedReader br = new BufferedReader(new FileReader("jlist.txt"));

            // Erste Linie sind Kolonnen Beschriftungen
            String firstLine = br.readLine().trim();
            String[] columnsName = firstLine.split(";");
            DefaultTableModel model = (DefaultTableModel) peopleList.getModel();
            model.setColumnIdentifiers(columnsName);

            // Daten vom TxT holen
            Object[] tableLines = br.lines().toArray();

            // Reihen mit Daten
            for (int i = 0; i < tableLines.length; i++) {
                String line = tableLines[i].toString().trim();
                String[] dataRow = line.split("/");
                model.addRow(dataRow);
                }
            }
            catch (IOException b) {
                b.printStackTrace();
            }
        }
    });
}

问题是,导入的数据仅显示在第一行:

This is how it looks right now

现在有人如何解决这个问题吗?

提前致谢!

最佳答案

问题在于如何将数据保存到文件

for (int row = 0; row < peopleModel.getRowCount(); row++) {
    for (int col = 0; col < peopleModel.getColumnCount(); col++) {
        o.println(peopleModel.getValueAt(row, col));
    }
}

在这里,您将 JTable 的每个单元格保存在新行中。您想要将每一行保存在新行中,并用/分隔值

for (int row = 0; row < peopleModel.getRowCount(); row++) {
    String r = "";
    for (int col = 0; col < peopleModel.getColumnCount(); col++) {
        r += peopleModel.getValueAt(row, col);
        if (col < peopleModel.getColumnCount() - 1) {
            r += "/";
        }
    }
    o.println(r);
}

编辑:正如 @camickr 所说,使用 StringJoiner 更好

for (int row = 0; row < peopleModel.getRowCount(); row++) {
    StringJoiner stringJoiner = new StringJoiner("/");
    for (int col = 0; col < peopleModel.getColumnCount(); col++) {
        stringJoiner.add(peopleModel.getValueAt(row, col).toString());
    }
    o.println(stringJoiner.toString());
}

关于java - 导入的数据仅显示在 JTable (Java) 的第一列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59145943/

相关文章:

java - XML 架构文件到字符串

java - 如何将字符串与 HashMap 中的键进行比较

java - 如何在 Java 对象编程中以最佳方式输入数据

java - 使用 JFileChooser 从文本文件复制到文本文件

Java 通过 HashMap 从 Object[][] 返回 int

java - 使用数据库中的数据禁用 JTable 中的特定行

java - 线程 "main"org.openqa.selenium.WebDriverException : java.net.SocketException 中出现异常:连接重置

java - 如何用多边形绘制云?

java - JTable 仅在我调用 GUI() 的新实例时刷新;

java - 未调用特定于类的渲染器组件