【问题标题】:How to write and read data in txt file in java如何在java中的txt文件中写入和读取数据
【发布时间】:2014-09-01 07:25:32
【问题描述】:

我是SO新手,我用java设计了一个表单,我添加了三个按钮提交清除显示记录。我需要获取有关提交事件的数据并将其传递给 txt 文件,并且我想在显示记录按钮单击事件中显示整个记录。我需要你们快速修复,我的时间不多了。这是我的代码:

import java.awt.*;  //import older gui library for content pane
import javax.swing.*;   //import newer gui library for labels, textfields, and button
import java.awt.event.*; //import gui event action library
import javax.swing.JRadioButton;

public class CustomerRecord extends JFrame implements ActionListener {

    // declare labels used on GUI screen
    private JLabel labelId, labelName, labelGender,labelcategory, labelPItem, labeldiscount;
    private JLabel labelError, labelRegistration; 
    private JTextField textId, textName, textGender, textState, textcategory, textPItem, textdiscount;
    // declare button used on GUI screen
    private JButton submitButton, clearButton, readButton;
    final JRadioButton jRadioMale = new JRadioButton("Male");
    final JRadioButton jRadioFemale = new JRadioButton("Female");
    // declare content pane
    private Container contentPane;

    public CustomerRecord() {
        createGUI();
    } // ends  constructor

    private void createGUI() {
        try {
            // get content pane and set the layout to null
            contentPane = getContentPane();
            contentPane.setLayout(null);    //free-form layout
            setFont(new Font("TimesRoman", Font.ITALIC, 14));

            // create the name label
            labelId = new JLabel(); //instantiate new JLabel
            labelId.setText("C.ID");    //set label text to name
            labelId.setLocation(38, 10);    //set location of JLabel
            labelId.setSize(200, 25);   //set size of JLabel
            labelId.setForeground(Color.BLACK);//set initial background color
            contentPane.add(labelId);   //add JLabel to content pane

            // create the name text box
            textName = new JTextField();    //instantiate new JTextField
            textName.setText("");   //clear JTextField
            textName.setToolTipText("Please enter ID");
            textName.setLocation(75, 10);   //set location of JTextFfield
            textName.setSize(200, 25);   //set size of JTextField
            contentPane.add(textName); //add jextfield to content pane

            // create the address label
            labelName = new JLabel();
            labelName.setText("Name:");
            labelName.setLocation(23, 50);
            labelName.setSize(80, 25);
            labelName.setForeground(Color.BLACK);
            contentPane.add(labelName);

            // create the address text box
            textName = new JTextField();
            textName.setText("");
            textName.setToolTipText("Please type in full name");
            textName.setLocation(75, 50);
            textName.setSize(300, 25);
            contentPane.add(textName);
            labelGender = new JLabel();
            labelGender.setText("Gender");
            labelGender.setLocation(30, 90);
            labelGender.setSize(300, 25);
            labelGender.setForeground(Color.BLACK);
            contentPane.add(labelGender);
            textGender = new JTextField();
            textGender.setText("");
            textGender.setToolTipText("M/F");
            textGender.setLocation(75, 90);
            textGender.setSize(130, 25);
            contentPane.add(textGender);
            labelcategory = new JLabel();
            labelcategory.setText("Category");
            labelcategory.setLocation(18, 170);
            labelcategory.setSize(300, 25);
            labelcategory.setForeground(Color.BLACK);
            contentPane.add(labelcategory);
            textcategory = new JTextField();
            textcategory.setText("");
            textcategory.setToolTipText("Item Type (Grocery)");
            textcategory.setLocation(75, 170);
            textcategory.setSize(130, 25);
            contentPane.add(textcategory);
            labelPItem = new JLabel();
            labelPItem.setText("Total Item");
            labelPItem.setLocation(15, 210);
            labelPItem.setSize(250, 25);
            labelPItem.setForeground(Color.BLACK);
            contentPane.add(labelPItem);
            textPItem = new JTextField();
            textPItem.setText("");
            textPItem.setToolTipText("Purchased items must be between start with 1 or 70");
            textPItem.setLocation(75, 210);
            textPItem.setSize(130, 25);
            contentPane.add(textPItem);
            labeldiscount = new JLabel();
            labeldiscount.setText("Discount");
            labeldiscount.setLocation(18, 250);
            labeldiscount.setSize(300, 25);
            labeldiscount.setForeground(Color.BLACK);
            contentPane.add(labeldiscount);
            textdiscount = new JTextField();
            textdiscount.setText("");
            textdiscount.setToolTipText("Entered Value must be containing ' % '");
            textdiscount.setLocation(75, 250);
            textdiscount.setSize(130, 25);
            contentPane.add(textdiscount);
            submitButton = new JButton();
            submitButton.setText("Submit");
            submitButton.setToolTipText("Click \"submit \" when the form is completely filled out");
            submitButton.setLocation(125, 450);
            submitButton.setSize(100, 30);
            contentPane.add(submitButton);
            submitButton.addActionListener(this);
            readButton = new JButton();
            readButton.setText("Show Records");
            readButton.setToolTipText("Click Show Record if you want to check record");
            readButton.setLocation(225, 350);
            readButton.setSize(200, 30);
            contentPane.add(readButton);
            readButton.addActionListener(this);

            clearButton = new JButton();
            clearButton.setText("Clear");
            clearButton.setToolTipText("Click \"clear \" when you want to clear the form");
            clearButton.setLocation(250, 450);
            clearButton.setSize(100, 30);
            contentPane.add(clearButton);
            clearButton.addActionListener(this);

            // create the error label
            labelError = new JLabel();
            labelError.setText("Please correct items in red");
            labelError.setLocation(150, 500);
            labelError.setSize(190, 25);
            labelError.setForeground(Color.RED);
            labelError.setVisible(false);
            contentPane.add(labelError);

            // create the registration label
            labelRegistration = new JLabel();
            labelRegistration.setText("Thank you for your entry.");
            labelRegistration.setLocation(145, 500);
            labelRegistration.setSize(190, 25);
            labelRegistration.setForeground(Color.BLACK);
            labelRegistration.setVisible(false);
            contentPane.add(labelRegistration);

            setTitle("Customer Form");  //set window title
            setSize(475, 600); //set window size
            setVisible(true);
        } catch (Exception e) {
        }
    }// ends creatGUI method.

    public static void main(String args[]) {
        CustomerRecord application = new CustomerRecord();
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }// ends main

    public void actionPerformed(ActionEvent event) {
        try {
            if (event.getActionCommand().equals("Submit")) {

                if (checkID() & checkName() & checkGender() &  check() & checkPItem() & checkdiscount()) {
                    labelRegistration.setVisible(true);
                    labelError.setVisible(false);    
                    submitButton.removeActionListener(this); 
                    clearButton.removeActionListener(this);  
                } else {
                    labelError.setVisible(true); 
                    labelRegistration.setVisible(false); 
                }
            } if (event.getActionCommand().equals("Clear")) 
                {
                textName.setText("");
                textName.setText("");
                textGender.setText("");
                textState.setText("");
                textcategory.setText("");
                textPItem.setText("");
                textdiscount.setText("");

                labelError.setVisible(false);
                labelRegistration.setVisible(false);
                labelId.setForeground(Color.BLACK);
                labelName.setForeground(Color.BLACK);
                labelGender.setForeground(Color.BLACK);
                labelcategory.setForeground(Color.BLACK);
                labelPItem.setForeground(Color.BLACK);
                labeldiscount.setForeground(Color.BLACK);

            }
        } catch (Exception e) { }
    }
    private boolean checkID() {
        if (textName.getText().length() == 0) {
            labelId.setForeground(Color.RED);   //name is not correct
            return false;
        } else {
            labelId.setForeground(Color.BLACK); //name is correct
            return true;
        }
    } 
    private boolean checkName() {
        if (textName.getText().length() < 5) {
            labelName.setForeground(Color.RED); 
            return false;
        } else {
            labelName.setForeground(Color.BLACK);
            return true;
        }
    } 

    private boolean checkGender() {
        if (textGender.getText().length() == 0) {
            labelGender.setForeground(Color.RED);
            return false;
        } else {
            labelGender.setForeground(Color.BLACK); 
            return true;
        }
    } 
    private boolean check() {
        try {

            if (textcategory.getText().length() == 5) {
                labelcategory.setForeground(Color.BLACK);
                return true;
            } else {
                labelcategory.setForeground(Color.RED); 
                return false;
            }
        } catch (Exception e) {
            labelcategory.setForeground(Color.RED);     
            return false;
        }
    } 
    private boolean checkPItem() {

            if (textPItem.getText().startsWith("1") || textPItem.getText().startsWith("70")) 
            {
                labelPItem.setForeground(Color.BLACK);
                return true;
            } else {
                labelPItem.setForeground(Color.RED);    
                return false;
            }      
    } 
    private boolean checkdiscount() {
        if (textdiscount.getText().contains("%"))
        {
            labeldiscount.setForeground(Color.BLACK);
                return true;
        } else
        {
            labeldiscount.setForeground(Color.RED); 
                return false;
        }
    }   
}

【问题讨论】:

  • 最好的开始是分离你的代码。理想情况下,您将拥有在单独的层中处理 txt 文件(读取、写入......)的代码,但至少在不同的 java 类中。这将使它更容易阅读,更不用说测试了。您还可以对类进行单元测试,而不必牢记 UI。另外:当心这样的代码:catch (Exception e) { } 隐藏异常(尤其是在开发过程中)是你能做的最糟糕的事情。
  • 探索java.io 包。
  • 避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
  • 这个问题似乎离题了,因为它是关于我们弥补 OP 糟糕的时间管理技能。

标签: java swing io


【解决方案1】:

在我提供答案之前更正了您错误执行的一些代码。

请检查我更正的区域。

您的代码:

    // create the name text box
        textName = new JTextField();    //instantiate new JTextField
        textName.setText("");   //clear JTextField
        textName.setToolTipText("Please enter ID");
        textName.setLocation(75, 10);   //set location of JTextFfield
        textName.setSize(200, 25);   //set size of JTextField
        contentPane.add(textName); //add jextfield to content pane

修改代码:

    // create the name text box
        textId = new JTextField();    //instantiate new JTextField
        textId.setText("");   //clear JTextField
        textId.setToolTipText("Please enter ID");
        textId.setLocation(75, 10);   //set location of JTextFfield
        textId.setSize(200, 25);   //set size of JTextField
        contentPane.add(textId); //add jextfield to content pane

============================= 然后我定义了读取文件和写入文件的两种新方法

这是写入文件

      private void writeToFile(String list) throws IOException{
///
                File f = new File("E:\\test1.txt");
                System.out.println(f);
                FileWriter fw = new FileWriter(f,true);
                System.out.println(fw);
                try{
                    BufferedWriter bw = new BufferedWriter(fw);
                    System.out.println(bw);
                    bw.newLine();
                    bw.write(list);
                    bw.flush();
                    bw.close();
                }
                catch(Exception e){
                    System.out.println(e);
                }
                ///
}

这是读取文件

private void readFile(){

     File f = new File("E:\\test1.txt");
try{
       FileReader fr = new FileReader(f);
       BufferedReader br = new BufferedReader(fr);
       while(br.ready()){
       System.out.println(br.readLine());
        }
}catch(Exception e){
    System.out.println(e);
}
}

然后在 actionPerforemed(ActionEvent e) 中添加新的 if 语句来处理来自“显示记录”按钮的事件,而您尚未添加它。在里面我调用 readFile() 它将打印读取文件的所有行。(这个读取文件是你要写入的同一个文件。)

         //Newly added event for Show Records button. 

        if (event.getActionCommand().equals("Show Records")) {
           readFile();
        }

然后在actionPerforemed(ActionEvent e)里面和提交按钮相关的if语句里面

添加了以下代码。

public void actionPerformed(ActionEvent event) {
    try {
        if (event.getActionCommand().equals("Submit")) {

            if (checkID() & checkName() & checkGender() & check() & checkPItem() & checkdiscount()) {
                labelRegistration.setVisible(true);
                labelError.setVisible(false);
                //concatnating the collected data to be written.
                String toBewrite = textId.getText() + "," + textName.getText();
                toBewrite = toBewrite + "," + textGender.getText() + "," + textcategory.getText();
                toBewrite = toBewrite + "," + textPItem.getText() + "," + textdiscount.getText();
                ///calling the writeToFile method where the relavent data to be updated to the file.
                writeToFile(toBewrite);
                ////
                submitButton.removeActionListener(this);
                clearButton.removeActionListener(this);
            } else {
                labelError.setVisible(true);
                labelRegistration.setVisible(false);
            }
        }
        if (event.getActionCommand().equals("Clear")) {
            textName.setText("");
            textName.setText("");
            textGender.setText("");
            textState.setText("");
            textcategory.setText("");
            textPItem.setText("");
            textdiscount.setText("");

            labelError.setVisible(false);
            labelRegistration.setVisible(false);
            labelId.setForeground(Color.BLACK);
            labelName.setForeground(Color.BLACK);
            labelGender.setForeground(Color.BLACK);
            labelcategory.setForeground(Color.BLACK);
            labelPItem.setForeground(Color.BLACK);
            labeldiscount.setForeground(Color.BLACK);

        }
        //Newly added event for Show Records button.
        if (event.getActionCommand().equals("Show Records")) {
            readFile();
        }
    } catch (Exception e) {
    }
}

【讨论】:

    【解决方案2】:

    首先让我指出一些错误(但不是致命的)设计。您所有的checkXxx() 方法都处理从字段中获取文本。我会将它们更改为接受字符串作为参数。原因是您将需要 actionPerformed 范围内的文本字段中的这些字符串值,以便将它们保存到您的文本文件中。

    我需要获取提交事件的数据并将其传递到 txt 文件

    您应该使用FileWriter 并使用此构造函数

    public FileWriter(String fileName, boolean append) throws IOException -
    在给定文件名的情况下构造一个 FileWriter 对象,该对象带有一个布尔值,指示是否附加写入的数据。

    这将允许您使用其append 方法之一附加到文件。

    我想在显示记录按钮点击事件中显示整个记录

    不确定您的意思是要读取所有条记录还是读取基于名称或其他内容的单个记录。对于前者,文本组件有一个read() 方法可以将整个文档读入文本组件(比如一个文本区域)。对于后者,您将需要逐行读取并检查该行的某些部分是否与您要匹配的数据匹配。这是基本的 io 东西。您可以在Basic I/O 阅读更多内容。例如,类似(假设您的记录/行是逗号分隔值):

    BufferedReader reader = new Bufferedreader(new FileReader(new File("file")));
    String line = null;
    while ((line = reader.readLine()) != null) {
        String[] tokens = line.split(",");
        String firstName = tokens[0].trim();
        if (firstName.equals(firstNameFieldtext)) {
            // use the tokens to populate the fields.
            break;
        }
    }
    reader.close();
    

    上面的代码只是逐行读取,将每一行拆分成一个数组。它检查第一个标记以查看名称是否与字段值匹配。如果是这样,那么您可以使用数组中的值来填充字段。

    如果您想将整个文件读入文本区域,您可以简单地将相同的 BufferedReader 传递给 read 方法,例如 textArea.read(reader, null);

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2015-05-29
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多