【问题标题】:Is it possible to read multiple lines from textfile and export it to their respective jtextfields?是否可以从文本文件中读取多行并将其导出到各自的 jtextfield?
【发布时间】:2016-10-18 11:32:50
【问题描述】:

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 等等……我尝试了一些教程,但无法真正弄清楚。

【问题讨论】:

标签: java user-interface io jframe jtextfield


【解决方案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;
   }
}

要注意的另一件事是,行的顺序必须与文本字段的顺序相对应。

编辑
我必须补充一点,所有这些都可以毫无问题地工作。但这不是一个非常优雅的解决方案。当您更改 UI 并且文本字段的顺序不同时会发生什么?或者您的文本文件中有一个重要的新行,但您的 UI 中没有 TextField?

编辑 2
您评论中的代码未显示您如何将 JTextFields 放入数组中。我的猜测是你正在使用一些 IDE 来创建 GUI,所以你应该在你的构造函数中有一个 initComomponents(); 调用或其他东西。在这种情况下,请从 loadActionPerformed 方法中删除行 JTextField[] textFields = new JTextField[10]; 并将其放入构造函数中,如下所示:

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
}

【讨论】:

  • 我更喜欢使用Collection 而不是Array。它的大小可以更容易地改变。
  • 好点!我个人的偏好是ArrayList<JTextField>,因为元素的顺序不会改变(在这种特定情况下)
  • private void loadActionPerformed(java.awt.event.ActionEvent evt) { // TODO 在此处添加您的处理代码: JTextField[] textFields = new JTextField[10];整数线=0;扫描仪scanner = new Scanner("reload.txt"); while(scanner.hasNextLine()){ textFields[line++].setText(scanner.nextLine()); if(line==textFields.length){ 中断; } } }
  • 看看我编辑的答案(Edit 2)。在那里,我向您展示了如何填充数组。我猜您使用 NetBeans 创建了一个 TextField 并将其命名为 koonf。然后 NetBeans 会为您编写一个名为 initComponents() 的方法(它是隐藏的,您不能直接更改它),在 initComponents() 的某处有一行 this.koontf = new JTextField()。没关系。文件顶部的某处是类的构造函数,在那里你应该看到initComponents(); 行。在该行之后填充数组:textFields[0] = koontf;
  • 对不起,我忘了new File("...") 让扫描仪读取文件。更正了编辑 3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2013-05-24
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多