我有一个文本文件,其中有4行随机单词,一行接一行,我需要能够读取每一行并将其显示到其文本字段中(第一行进入第一个文本字段,等等(,但它只读取最后一行并显示到任何文本字段中。
"myfile.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();
}
}
当前代码依次读取每一行,并为每一行将所有标签的文本设置为该行文本。
相反,您需要依次获取每个标签,并将其文本设置为文件的下一行。你可以用这样的东西来做到这一点:
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
}
});
}
您正在读取一行,然后将该行的内容设置为所有3/4 TextFields(示例中缺少一个(。循环结束后,所有TextFields都设置为文件最后一行的内容。
有多种方法可以实现您想要的内容-如果您只有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]);
如果你在一个数组中引用了你的TextFields,你也可以进行
int index = 0;
while ((line = reader.readLine()) != null) {
labels[index++].setText(line);
if (index==4) break;
}
问题出现在循环中
while ((line = reader.readLine()) != null) {
label1Text.setText(line);
label2Text.setText(line);
label3Text.setText(line);
labelO2Text.setText(line);
}
基本上,如果我们观察循环,第一次迭代将所有标签都更改为单词";一";,循环中的第二次迭代将所有标签设置为"0";两个";,比";三个";并且最后一次迭代将所有标签设置为"0";四";。
为了解决这个问题,你可以添加一个简单的计数器和一些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++;
}
我确信这不是最优化的方式,但如果你想用循环来做,那就是了