JavaFX чтение текстового файла и отображение его в нескольких текстовых полях

#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  ;                      
}
  

Я уверен, что это не самый оптимальный способ, но если вы хотите сделать это с помощью цикла, вот и все.