Ввод переменных данных в блокнот

В настоящее время я работаю над проектом, который в основном представляет собой форму отслеживания контактов. Функция, которую я пытаюсь реализовать, заключается в том, что при нажатии кнопки печати данные вводятся в текст блокнота. Хотя этот проект предназначен только для развлечения, я пытаюсь завершить его, чтобы больше узнать о java.

Вот мой код:


package com.company;

import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

public class Main extends JFrame implements ActionListener {
    //Initialization of Form
    JPanel panel;
    JLabel Name_label;
    JLabel Address_label;
    JLabel Temp_label;
    JLabel Age_label;
    JLabel Contact_label;
    JLabel Date_label;
    JLabel msg_label;
    JLabel msg2_label;
    static JTextField address_text;
    static JTextField name_text;
    static JTextField age_text;
    static JTextField temp_text;
    static JTextField cn_text;
    static JTextField date_text;
    JButton submit, exit, print;


    Main() {
        //Name Label
        Name_label = new JLabel();
        Name_label.setText("Name: ");
        name_text = new JTextField();
        //Date Label
        Date_label = new JLabel();
        Date_label.setText("Date: ");
        date_text = new JTextField();
        //Address Label
        Address_label = new JLabel();
        Address_label.setText("Complete Address: ");
        address_text = new JTextField();
        //Contact Number
        Contact_label = new JLabel();
        Contact_label.setText("Contact Number");
        cn_text = new JTextField();
        //Age Label
        Age_label = new JLabel();
        Age_label.setText("Age:");
        age_text = new JTextField();
        //Temperature Label
        Temp_label = new JLabel();
        Temp_label.setText("Temperature: ");
        temp_text = new JTextField();
        //Submit
        submit = new JButton("SUBMIT");
        panel = new JPanel(new GridLayout(9, 3));
        exit = new JButton("EXIT");
        print = new JButton("Print");
        //Message
        msg_label = new JLabel();
        msg2_label = new JLabel();
        //Adding elements
        panel.add(Name_label);
        panel.add(name_text);
        panel.add(Date_label);
        panel.add(date_text);
        panel.add(Address_label);
        panel.add(address_text);
        panel.add(Contact_label);
        panel.add(cn_text);
        panel.add(Age_label);
        panel.add(age_text);
        panel.add(Temp_label);
        panel.add(temp_text);
        panel.add(msg_label);
        panel.add(msg2_label);
        panel.add(submit);
        panel.add(exit);
        panel.add(print);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //Listeners
        submit.addActionListener(this);
        add(panel, BorderLayout.CENTER);
        setTitle("Contact Tracing Form");
        setSize(1000, 530);
        setVisible(true);
        exit.addActionListener((event) -> System.exit(0));
        print.addActionListener(note());
    }

    private ActionListener note() {
        File file = new File("/users/agcao/contactform.txt");
        String name = name_text.getText();
        String date = date_text.getText();
        String address = address_text.getText();
        String age = age_text.getText();
        String cn = cn_text.getText();
        String temp = temp_text.getText();


        FileWriter fw = null;
        try {
            fw = new FileWriter(file.getAbsoluteFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
        assert fw != null;
        BufferedWriter bw = new BufferedWriter(fw);
        try {
            bw.write(name);
            bw.write(date);
            bw.write(address);
            bw.write(age);
            bw.write(cn);
            bw.write(temp);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //step2: write it
        try {
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Done");
        return null;
    }

    public static void main(String[] args) throws IOException {
        new Main();
    }







    @Override
    public void actionPerformed(ActionEvent e) {
        //Initialization
        String name = name_text.getText();
        double tempe = Double.parseDouble(temp_text.getText());
        int Iage = Integer.parseInt(age_text.getText());
        //Process
        if (Iage < 15 && tempe >= 37.5)
            msg_label.setText("Sorry, " + name + ", You cannot enter this establishment due to your age and temperature!");
        else if (tempe >= 37.5)
            msg_label.setText("Sorry, " + name + ", You cannot enter this establishment due to your temperature!");
        else if (Iage < 15)
            msg_label.setText("Sorry," + name + "you cannot enter this establishment due to your age!");
        else
            msg_label.setText("Hello  " + name + ", You may enter this building. Thank you");

    }
}

    enter code here

sorry if it is too redundant or poorly made. I am still currently trying to become a better developer. Thanks


person Jared Blaise Agcaoili    schedule 19.01.2021    source источник
comment
Но в чем вопрос?   -  person MrFisherman    schedule 19.01.2021
comment
Что я могу использовать для ввода данных переменной в файл .txt. Прости   -  person Jared Blaise Agcaoili    schedule 19.01.2021


Ответы (1)


В вашем коде записи файлов нет ничего плохого, проблема в вашем возвращаемом значении. В методе note() вы указываете, что он возвращает ActionListener, и добавляете этот ActionListener к компоненту print. Но если я посмотрю на ваш код, вы вообще не вернете никакого ActionListener! Вы просто return null;. Исправление простое: просто верните ActionListener, а не null. Ниже приведен ваш note() метод, измененный. Для краткости я обрезал его до первых трех строк.

private ActionListener note() {
    return new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            File file = new File("contactform.txt");
            String name = name_text.getText();
            String date = date_text.getText();
            ...
        }
    };
}

Теперь в приведенном выше коде используется нечто, называемое анонимным классом. Я создаю новый подкласс ActionListener, в котором переопределил метод actionPerformed(), а затем возвращаю его. Однако поскольку ActionListener имеет только один метод, этот код можно сократить еще больше, используя лямбда-выражение. Вот пример использования лямбды:

private ActionListener note() {
    return (event) -> {
        File file = new File("contactform.txt");
        String name = name_text.getText();
        String date = date_text.getText();
        ...
    };
}

Другая возможность, используя лямбда, состоит в том, чтобы вместо возврата ActionListener вы вставили лямбда при добавлении ActionListener к компоненту print. Это будет работать точно так же, без изменения метода note():

print.addActionListener((event) -> note());
person Charlie Armstrong    schedule 19.01.2021
comment
Спасибо. Сейчас он работает, но в созданном мною файле .txt ничего нет. Это мой второй вопрос. Прости - person Jared Blaise Agcaoili; 19.01.2021
comment
Без проблем! Но я не уверен, что понимаю, о чем вы говорите. Работает, но в файл ничего не выводит? Под его работой вы просто имеете в виду, что он не вызывает никаких ошибок или действительно что-то делает с файлом? Я только что понял, что изменил путь к файлу в своем ответе, возможно ли, что вы смотрите не на нужный файл? Если вы удалите файл, он снова создаст файл? - person Charlie Armstrong; 19.01.2021
comment
Прости. Под словом «работает» я имею в виду отсутствие ошибок. Даже до того, как вы исправили часть записи файла для метода, он не печатает фактический ввод пользователя в файл .txt. Это то, что я пытался реализовать. - person Jared Blaise Agcaoili; 19.01.2021
comment
@JaredBlaiseAgcaoili Мне очень жаль, но я не могу воспроизвести проблему, с которой вы столкнулись. Когда я запускаю ваш точный код после внесения одного из описанных выше изменений, я могу вводить данные в графический интерфейс, нажимать кнопку «Печать», и все это записывается в текстовый файл. Все в одной строке, но все есть. Вы уверены, что это не что-то внешнее по отношению к программе, например, возможно, файл имеет доступ только для чтения, или вы проверяете не тот файл, или вы запускаете его внутри виртуальной машины (не JVM), или вы ошиблись в одном из названия папок или что-то в этом роде? Кроме того, какую версию Java вы используете? - person Charlie Armstrong; 21.01.2021
comment
Программа теперь работает со всеми необходимыми действиями и многому меня научила в java. - person Jared Blaise Agcaoili; 21.01.2021
comment
@JaredBlaiseAgcaoili Замечательно! Рад, что у вас все работает! Удачи в изучении Java :) - person Charlie Armstrong; 21.01.2021