Можно ли прочитать несколько строк из текстового файла и экспортировать их в соответствующие jtextfields?

#java #user-interface #io #jframe #jtextfield

#java #пользовательский интерфейс #io #jframe #jtextfield

Вопрос:

 private void loadActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // TODO add your handling code here:
    try{
        FileReader reader = new FileReader("reload.txt");
        BufferedReader br = new BufferedReader(reader);
        koontf.read(br,null);
        baamtf.read(br,null);
        sachitf.read(br,null);
        fakertf.read(br,null);
        phonsekaltf.read(br,null);
        lauretf.read(br,null);
        yeontf.read(br,null);
        aguerotf.read(br,null);
        agnistf.read(br,null);
        lokitf.read(br,null);
        lawliettf.read(br,null);
        ryuzakitf.read(br,null);
        br.close();
        koontf.requestFocus();
        baamtf.requestFocus();
        sachitf.requestFocus();
        fakertf.requestFocus();
        phonsekaltf.requestFocus();
        lauretf.requestFocus();
        yeontf.requestFocus();
        aguerotf.requestFocus();
        agnistf.requestFocus();
        lokitf.requestFocus();
        lawliettf.requestFocus();
        ryuzakitf.requestFocus();

    }catch(IOException e) {

    }
}                                    
  

Возможно ли вообще поместить каждую из них в определенное текстовое поле?Например, 12 в jtextfield1, 10 в jtextfield2 и так далее…Я пробовал некоторые учебные пособия и не могу в этом разобраться.

Комментарии:

1. лучше сохраняйте как json, считывайте его обратно и устанавливайте в соответствующее поле. для справки посмотрите на mkyong.com/java/json-simple-example-read-and-write-json

Ответ №1:

Вы можете поместить все свои текстовые поля в массив, а затем выполнить итерацию по этому массиву во время чтения текстового файла. Вот так:

 JTextField[] textFields = new JTextField[10];
// ... init your textFields here

int line =0;  // first line will be first textfield and so on
Scanner scanner = new Scanner(new File("reload.txt"));  // use Scanner instead of FileReader, it's easier :) 
while(scanner.hasNextLine()){   // as long as you did not reach the end of the file
    textFields[line  ].setText(scanner.nextLine()); // get the next line and put it in the respective textfield
}
  

Однако в этом случае вы должны убедиться, что для каждой строки есть текстовое поле или что вы не читаете больше строк, чем текстовых полей.

например:

 while(.....){
   ....
   if(line==textFields.length){
       break;
   }
}
  

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

Редактировать
Я должен добавить, что все это может работать без каких-либо проблем. Но это не очень элегантное решение. Что происходит, когда вы меняете свой пользовательский интерфейс, а текстовые поля расположены в другом порядке? Или в вашем текстовом файле есть важная новая строка, но в вашем пользовательском интерфейсе нет текстового поля?

Редактировать 2
Код из вашего комментария не показывает, как вы помещаете JTextFields в свой массив. Я предполагаю, что вы используете какую-то среду IDE для создания графического интерфейса, поэтому у вас должен быть initComomponents(); вызов или что-то в вашем конструкторе. В этом случае удалите строку JTextField[] textFields = new JTextField[10]; из вашего loadActionPerformed метода и поместите ее в свой конструктор следующим образом:

 public class MyClass{

     private JTextField[] textFields;

     public MyClass(){
         initComponents();
         this.textFields = new JTextField[10]  // where 10 is the number of lines in your textfile AND the number of JTextFields you have in your GUI
         // then fill the array (by hand if you like)
         this.textField[0] = koontf;
         this.textField[1] = baamtf;
         // and so on..
     }
  

Редактировать 3
Просто чтобы было понятно, это то, что вам нужно для запуска программы. Допустим, ваш класс вызывается MyClass , тогда он может выглядеть так:

 private JTextField[] textFields;  // this creates your array

public MyClass(){        // this is the constructor of your class (I don't know how it is called) 
    initComponents();    // auto generated code from NetBeans to initalize your GUI elements
    // init your array
    textFields = new JTextField[12];  // 12 if I counted correctly
    // fill it
    textFields[0] = koontf;
    textFields[1] = baamtf;
    textFields[2] = sachitf;
    textFields[3] = fakertf;
    textFields[4] = phonsekaltf;
    textFields[5] = lauretf;
    textFields[6] = yeontf;
    textFields[7] = aguerotf;
    textFields[8] = agnistf;
    textFields[9] = lokitf;
    textFields[10] = lawliettf;
    textFields[11] = ryuzakitf;
}

private void loadActionPerformed(java.awt.event.ActionEvent evt){
    int line = 0;
    try(Scanner scanner = new Scanner(new File("reload.txt"))){
        while(scanner.hasNextLine()){
            textFields[line  ].setText(scanner.nextLine());
            if(line == textFields.length){
                break;
            }
        }
    }catch(FileNotFoundException ex){
        Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
    }
    koontf.requestFocus();  // you can only call request focus on one element at a time (it does not make sense to call it on all textfields
}
  

Комментарии:

1. Я бы предпочел использовать a Collection вместо an Array . Его размер можно изменить проще.

2. Хороший момент! Мое личное предпочтение заключается ArrayList<JTextField> в том, что порядок элементов не меняется (в данном конкретном случае)

3. выполнено частное действие с пустой загрузкой (java.awt.event. ActionEvent evt) { // TODO добавьте сюда свой код обработки: JTextField[] TextFields = new JTextField[10]; int line =0; Scanner сканер = новый сканер («reload.txt «); while(scanner.hasNextLine()){ Текстовые поля[строка ].setText(scanner.nextLine()); если(строка ==Текстовые поля. длина) { разрыв; } } }

4. Взгляните на мой отредактированный ответ ( редактирование 2 ). Там я покажу вам, как заполнить массив. Я предполагаю, что вы создали текстовое поле с помощью NetBeans и вызвали его koonf . Затем NetBeans напишет для вас вызываемый метод initComponents() (он скрыт, и вы не можете изменить его напрямую), а внутри initComponents() где-то есть строка this.koontf = new JTextField() . Все в порядке, как есть. Где-то в верхней части вашего файла находится конструктор вашего класса, и там вы должны увидеть строку initComponents(); . Заполните массив после этой строки следующим образом: textFields[0] = koontf;

5. Извините, я забыл new File("...") , чтобы сканер прочитал файл. Исправлено редактирование 3 .