【问题标题】:JavaFX reading a text file and displaying it to multiple text fieldsJavaFX 读取文本文件并将其显示到多个文本字段
【发布时间】:2020-08-31 16:21:10
【问题描述】:

我有一个包含 4 行随机单词的文本文件,一行一行,我需要能够读取每一行并将其显示到其文本字段(第一行进入第一个文本字段等),但它只读取最后一行并将其显示到任何文本字段中。

“我的文件.txt”
一个

两个

三个

一二三

TextField label1Text = new TextField();
TextField label2Text = new TextField();
TextField label3Text = new TextField();


load.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent l) {
        
        
        String line = ""; 
        try {
        BufferedReader reader = new BufferedReader(new FileReader("myfile.txt"));
              
            while ((line = reader.readLine()) != null) {
           
              label1Text.setText(line);
              label2Text.setText(line);
              label3Text.setText(line);
              labelO2Text.setText(line);   
            }
            
        } 

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

    primaryStage.show();
    

    
}    
 

}

【问题讨论】:

  • "对于文件中的每一行,在所有四个文本字段中显示该行。"它正在做你要求它做的事情。
  • 不带循环试试看。
  • 你的 while 循环结束了,最后一圈,所有字段都填充了最后一行。尝试将您的文本字段放入一个数组中并按索引填充每一行。
  • 这与 fx 无关,它是纯 java。所以是时候学习语言基础教程了,特别是循环是什么..

标签: java javafx textfield


【解决方案1】:

您当前的代码依次读取每一行,并为每一行将所有标签的文本设置为该行文本。

相反,您需要依次获取每个标签,并将其文本设置为文件的下一行。你可以这样做:

try (BufferedReader reader = new BufferedReader(new FileReader("myfile.txt"))) {
    List.of(label1Text, label2Text, label3Text, label02Text)
        .forEach(label -> {
             try {
                label.setText(reader.readLine());
             } catch (IOException exc) {
                 // handle exception
             }
        });
} 

【讨论】:

    【解决方案2】:

    您正在阅读一行,然后将该行的内容设置为所有 3/4 文本字段(您的示例中缺少一个)。循环结束后,所有 TextField 都设置为文件最后一行的内容。

    有多种方法可以实现您想要的 - 如果您只有 4 个条目,那么以下方法将起作用:

     String[] lines = new String[4];
     int index = 0;
     while ((line = reader.readLine()) != null) {   
        lines[index++] = line;
        if (index==4) break;
     }
     label1Text.setText(lines[0]);
     label2Text.setText(lines[1]);
     label3Text.setText(lines[2]);
     label4Text.setText(lines[3]);
    

    如果您在数组中引用了您的 TextField,您也可以这样做

     int index = 0;
     while ((line = reader.readLine()) != null) {   
        labels[index++].setText(line);
        if (index==4) break;
     }
    

    【讨论】:

      【解决方案3】:

      问题在于你的循环

      while ((line = reader.readLine()) != null) {
          label1Text.setText(line);
          label2Text.setText(line);
          label3Text.setText(line);
          labelO2Text.setText(line);   
      }
      

      基本上,如果我们查看循环,第一次迭代将所有标签更改为单词“One”,循环中的第二次迭代将所有标签设置为“Two”,而不是“Three”,最后一次迭代将所有标签设置为“四”。

      要解决这个问题,您可以添加一个带有一些 if 语句的简单计数器,这样它就会告诉您的循环该做什么。

      int counter = 0;
      while ((line = reader.readLine()) != null) {
          if(counter == 0)
              label1Text.setText(line);
          if(counter == 1)
              label2Text.setText(line);
          if(counter == 2)
              label3Text.setText(line);
          if(counter == 3)
              labelO2Text.setText(line);
          counter++;                      
      }
      

      我确信这不是最理想的方式,但如果你想用循环来做,就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 2015-03-19
        相关资源
        最近更新 更多