#java #javafx #textfield
#java #javafx #текстовое поле
Вопрос:
У меня есть текстовый файл с 4 строками случайных слов, строка за строкой, и мне нужно иметь возможность читать каждую строку и отображать ее в текстовом поле (первая строка переходит в первое текстовое поле и т.д.), Но это только чтение последней строки и отображение ее в любом текстовом поле.
«myfile.txt «
один
два
три
onetwothree
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();
}
}
Комментарии:
1. «Для каждой строки в файле отобразите строку во всех четырех текстовых полях». Он делает именно то, что вы просите его сделать.
2. Попробуйте это без цикла.
3. Ваш цикл while завершается, и на этом последнем обходе все поля заполняются последней строкой. Попробуйте поместить свои текстовые поля в массив и заполнить каждую строку по индексу.
4. это не связано с fx, это обычная java. Итак, пришло время изучить руководство по основам языка, в частности, что такое циклы..
Ответ №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 текстовых полей (в вашем примере одно отсутствует). После завершения цикла все текстовые поля устанавливаются в соответствии с содержимым последней строки вашего файла.
Существует множество способов достичь того, чего вы хотите — если у вас есть только 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]);
Если бы у вас были ссылки на ваши текстовые поля в массиве, вы также могли бы сделать
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);
}
В принципе, если мы посмотрим на цикл, первая итерация изменяет все метки на слово «Один», вторая итерация в цикле устанавливает все метки на «Два», а не на «Три», а последняя итерация устанавливает все метки на «Четыре».
Чтобы решить проблему, вы можете добавить простой счетчик с некоторыми операторами 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 ;
}
Я уверен, что это не самый оптимальный способ, но если вы хотите сделать это с помощью цикла, вот и все.