在 TableView JavaFX 中显示文件中的数据

Displaying data from a file in a TableView JavaFX

提问人:Vmir 提问时间:9/16/2021 更新时间:9/16/2021 访问量:608

问:

我正在尝试在 JavaFX 中创建一个简单的 ToDo 应用程序。用户输入的所有数据都将写入 txt 文件,然后从该文件中读取并显示在 TableView 中。 TableView 有三列,其中第一列表示用户的名称,第二列显示日期,第三列显示其他信息。当用户将数据输入到三列中时,将从用户输入并存储在文件中的三个参数(String name、String date、String additionalInfo)创建一个 Value 类。

使用以下方法将数据写入文件:

  public void updateFile() {
       //Deleting a file and creating a new one to update data
        if (myFile.delete()) {
            System.out.println("File deleted");
        }
        try {
            if (myFile.createNewFile())
                System.out.println("File created");

        } catch (IOException e) {
            e.printStackTrace();
        }

        StringBuilder stringBuilder = new StringBuilder();
       //going through user's data
        for(int i = 0; i<arrList.size(); i++){
            for(int j=0; j< arrList.get(i).size();j++){
                stringBuilder.append(arrList.get(i).get(j)+"\n");
            }
        }

        try {
            FileWriter myWriter = new FileWriter("file.txt");
            myWriter.write(stringBuilder.toString());
            myWriter.close();
            blankLabel.setStyle("-fx-text-fill: green");
            blankLabel.setText("Saved");
            LabelAnimation la = new LabelAnimation(blankLabel, 3);
        } catch (IOException e) {

            e.printStackTrace();
        }
    }


假设用户输入 Name TextField:

John Overflow

放入 Date TextField:

12.02.2021

最后输入附加信息文本字段:

YAY!

该文件将包含以下值:

John Overflow
12.02.2021
YAY!

因此,输入的值将逐行存储在文件中 现在,当我想显示文件中
的值时,我调用以下方法:

  public void setTableViewFromFile(){

            try {
                Scanner sc = new Scanner(myFile);

                while(sc.hasNextLine()){
                   String name = sc.nextLine();//Name
                    String date = sc.nextLine();//Date
                    String info = sc.nextLine();//Additional Info

                    Value value = new Value(name, date, info);
                    tableView.getItems().add(value);

                    storeValue();//stores value in an ArrayList of values
                }


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

此实现适用于单行字符串,但在用户在 AdditionalInfo TextField 中输入“\n”(换行符)时不起作用,因为此新行将被视为 Value 的单独参数。 举例说明:

TextField AdditionalInfo: 

YAY!

I'm stuck!

Please Help me!

程序将终止并显示错误消息“未找到行”,因为 “YAY!”将被分配给一个 info String 并完成一个上一个 Value 类。
“I'm stuck!”将被分配给一个名称 String,“Please Help me!” 将分配给一个日期字符串和一个 Value 类,但是它不能被创建,因为它需要三个参数(name、date、info),而程序只提供两个(name 和 date)。
如何以不同的方式将数据存储在文件中,以便在扫描文件时,字符串名称仅分配文件中表示名称的值,仅分配字符串日期信息,仅分配字符串信息,仅分配字符串信息,仅分配其他信息,其中包括用户键入的所有内容?

java 文件 javafx io java.util.scanner

评论

2赞 trashgod 9/16/2021
您需要尽早清理输入,可能是在 Pleas 使用关注问题的该方面的最小可重复示例编辑您的问题之前。updateFile()
1赞 jewelsea 9/16/2021
使用结构化格式来存储数据、e.g. json或 XML。在 Jackson 等库的帮助下,这相对简单(链接的文档中有一个专门用于日期格式的部分,这是您问题的一部分)。另请查看 makery 教程,了解该参考应用程序如何执行类似的任务。
2赞 SedJ601 9/16/2021
我真的很喜欢 JSON 和 XML,但对于一个简单的应用程序,我建议使用 CSV 或 TSV 格式。我个人最喜欢的是使用 RECORD SEPARATOR,没有人推荐用于简单的项目。它有助于消除与使用或分离文件相关的许多问题。TabsCommas
3赞 SedJ601 9/16/2021
另外,如果您不必使用它,请远离它。如果您使用 CSV、TSV 或 RSV,则可以使用将行读取到 .从那里你只需在分离器上分裂。对于一个简单的程序,您可能可以摆脱 CSV 和 TSV 的束缚。如果这是一个严肃的程序,我建议使用 CSV 或 TSV 库。ScannerFiles.readAllLinesList
3赞 jewelsea 9/16/2021
我认为在这种情况下,结构化格式的选择并不像仅仅拥有一种格式那么重要。JSON/XML/CSV/YAML,不管怎样,由一个可靠的解析器(建议使用库实现,而不是你自己编写的东西)支持,都可以。如果你想锤钉子,有一把锤子是有帮助的,锤子颜色的选择在功能上不太重要,尽管颜色是一个重要的美学(我喜欢红色和银色的)。因此,选择一种格式,尝试实现它,如果您遇到困难,请在尝试中生成一个范围有限的新问题和一个可重复性最小的示例

答: 暂无答案