【问题标题】:Java Jframe get input and write to file [duplicate]Java Jframe获取输入并写入文件[重复]
【发布时间】:2017-11-17 13:54:15
【问题描述】:

我有一个项目想从 jframe 获取输入。在代码运行时,我只需要一次输入 3 个人员数据,并将该数据写入文件名 person.txt。这些数据具有名称昵称年龄,当我编译我的代码时,它不起作用,我只写一个person.txt 文件中的数据。请帮帮我?我无法在我的项目中获得这些。我该怎么办 ?

 public class JavaGui {
  public String data = "";
  JFrame f;
  JLabel l1, l2, l3;
  JTextField tf1, tf2, tf3;
  JButton b;
  JavaGui() {

   FileWriter fw = null;
   try {
    fw = new FileWriter("person.txt");
   } catch (IOException ex) {
    Logger.getLogger(JavaGui.class.getName()).log(Level.SEVERE, null, ex);
   }

   PrintWriter pw = new PrintWriter(fw);


   f = new JFrame("Java GUI");
   l1 = new JLabel("Name");
   l1.setBounds(20, 50, 80, 30);
   tf1 = new JTextField();
   tf1.setBounds(100, 50, 200, 30);

   l2 = new JLabel("Nickname");
   l2.setBounds(20, 100, 80, 30);
   tf2 = new JTextField();
   tf2.setBounds(100, 100, 200, 30);

   l3 = new JLabel("Age");
   l3.setBounds(20, 150, 80, 30);
   tf3 = new JTextField();
   tf3.setBounds(100, 150, 200, 30);

   b = new JButton("Save");
   b.setBounds(100, 200, 70, 30);

   f.add(l1);
   f.add(tf1);
   f.add(l2);
   f.add(tf2);
   f.add(l3);
   f.add(tf3);
   f.add(b);
   f.setSize(350, 350);
   f.setLayout(null);
   f.setLocationRelativeTo(null);
   f.setResizable(false);
   f.setVisible(true);
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   for (int i = 0; i < 3; i++) {
    b.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {

      String name = "";
      String nickname = "";
      String ageS = "";
      int age = 0;
      try {
       name = "Name : " + tf1.getText();
       nickname = "Nickname : " + tf2.getText();
       age = Integer.parseInt(tf3.getText());

       if (age > 0 && age < 100) {
        ageS = "Age : " + age;
       } else {
        JOptionPane.showMessageDialog(null, "Please Enter Age field by Positive number Or Less than 100");
       }
      } catch (NumberFormatException ex) {
       JOptionPane.showMessageDialog(null, "Please enter Age field by number type");

      }

      data += name + " " + nickname + " " + ageS;

      pw.println(data);
      pw.close();

     }

    });
   }

  }

  public static void main(String[] args) {
   new JavaGui();
  }

 }

【问题讨论】:

  • 我得到了这样的信息Name : MyName Nickname : MyNickname Age : 14 它似乎按我的预期工作。话虽如此,将pw.println(data); pw.close(); 更改为pw.println(data); pw.flush(); pw.close(); 是最安全的。一般建议: 1) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同的语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 ..
  • .. white space 的布局填充和边框。 2) 请参阅Detection/fix for the hanging close bracket of a code block 了解我无法再费心解决的问题。
  • 先生,我想在这段代码中添加多个人的数据。请帮帮我?
  • 试试 FileWriter 而不是 PrintWritter

标签: java swing file-io io printwriter


【解决方案1】:

我想在里面添加多个人的数据

您想使用 FileWriter(不是 PrintWriter)写入文件。

然后,当您创建FileWriter 时,您可以将数据“附加”到文件中。阅读 FileWriter API 以了解要使用的适当构造函数。

【讨论】:

  • 谢谢,但我想输入 3 次,然后我想将之前的输入写入文件 .txt 。帮帮我
  • 我确实帮助了你。我不明白这个问题。如果您可以将一个人写入文件,为什么不能写入第二个人?代码将是相同的,只是数据不同或您获取数据的位置不同。 .
  • 问题是如何获得多人的输入。当我在这段代码中使用循环时,我得到了相同的 person data 。我需要不同的人数据。在这种情况下,我可以输入我想要多少人,所有这些数据都会保存到 person.txt 文件中
  • 你需要设计你的应用程序来接受来自多个人的数据所以首先摆脱循环。它不是必需的,也不应该在事件驱动的 GUI 中使用。所以你有文本字段,用户可以在其中输入数据。然后你有一个“保存”按钮。当用户单击保存按钮时,您从文本字段中获取数据并将其写入文件。然后从文本文件中清除数据,以便用户可以输入更多数据。
  • 那么是不是不用循环了兄弟?
【解决方案2】:

经过测试并且工作正常。我添加了下一步按钮,因此每次您在 StringBuilder 中添加新数据时,最后您都可以保存该人员。您可以删除计数器(我添加了计数器以仅添加 3 人)并制作没有限制。

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JavaGui {
JFrame f;
JLabel l1, l2, l3;
JTextField tf1, tf2, tf3;
JButton b,next;
int counter;

StringBuilder data = new StringBuilder();
JavaGui() {}

public static void main(String[] args) {

    FileWriter fw = null;
    try{
        fw = new FileWriter("person.txt");
        PrintWriter pw = new PrintWriter(fw);
        new JavaGui().go(pw);

       }catch (IOException ex) {
        Logger.getLogger(JavaGui.class.getName()).log(Level.SEVERE, null, ex);
    }


}

public void go(PrintWriter pw) {

    f = new JFrame("Java GUI");
    l1 = new JLabel("Name");
    l1.setBounds(20, 50, 80, 30);
    tf1 = new JTextField();
    tf1.setBounds(100, 50, 200, 30);

    l2 = new JLabel("Nickname");
    l2.setBounds(20, 100, 80, 30);
    tf2 = new JTextField();
    tf2.setBounds(100, 100, 200, 30);

    l3 = new JLabel("Age");
    l3.setBounds(20, 150, 80, 30);
    tf3 = new JTextField();
    tf3.setBounds(100, 150, 200, 30);

    next = new JButton("Next");
    next.setBounds(100, 200, 70, 30);

    b = new JButton("Save");
    b.setBounds(180, 200, 70, 30);

    f.add(l1);f.add(tf1);
    f.add(l2);f.add(tf2);
    f.add(l3);f.add(tf3);
    f.add(next);
    f.add(b);
    f.setSize(350, 350);
    f.setLayout(null);
    f.setLocationRelativeTo(null);
    f.setResizable(false);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    next.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String name = "";
            String nickname = "";
            String ageS = "";
            int age = 0;

              try{    
                name = "Name : " + tf1.getText();
                nickname = "Nickname : " + tf2.getText();
                age =Integer.parseInt(tf3.getText());

                if(age > 0 && age < 100) {
                    ageS = "Age : " + age;
                }else{
                    JOptionPane.showMessageDialog(null, "Please Enter Age field by Positive number Or Less than 100");
                }
               }catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(null, "Please enter Age field by number type");
               }

               data.append(name + " " + nickname + " " + ageS);
               data.append(System.getProperty("line.separator"));

               counter++;

               tf1.setText("");
               tf2.setText("");
               tf3.setText("");

               if(counter > 2)
                   next.setEnabled(false);
        }

    });

    b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){

            pw.print(data.toString());
            pw.close();

        } 

    });
 }

}

【讨论】:

  • 我在这段代码中正确使用了for循环吗?我想输入 3 次,然后我想将之前的输入写入文件 .txt 。帮帮我
  • 所以你想在文件中写入3次相同的数据?
  • 不,兄弟,如果我问的不清楚,对不起。我想在代码运行时仅一次获取不同的人员数据。所以我选择了 for 循环来做这件事,但这不是我的期望。我只能为一个保存到 person.txt 文件的人写一次。 for 循环是在做同一个人。帮我找到最好的方法兄弟?
  • OP使用FileWriter,将其包裹在PrintWriter中-资源管理也是错误的,因为作者应该在actionPerformed方法中打开并在@中关闭987654325@ 或 try-with-resources
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2015-08-04
  • 1970-01-01
  • 2018-08-07
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多