JTextField не принимает более 1 ввода - PullRequest
0 голосов
/ 01 марта 2019

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

Код, который у меня есть, работает только при первом нажатии «Enter».После этого, когда я делаю это снова, выдает исключение.

Кто-нибудь может мне здесь помочь?

public static void main(String [] args) throws IOException {

    //creates file or opens existing file
    File f = new File("C:/Users/User/Desktop/course.txt");
    Scanner sc = new Scanner(System.in);
    FileWriter w = new FileWriter(f.getAbsoluteFile(), true);
    BufferedWriter r = new BufferedWriter(w);

    //GUI Setting
    JFrame frame = new JFrame();
    JLabel text = new JLabel();
    JLabel results = new JLabel();
    JPanel panel = new JPanel();
    JTextField textField = new JTextField();

    textField.setPreferredSize(new Dimension(450, 30));
    text.setText("Enter \"END\" to terminate program OR \"CLEAR ALL\" to delete everything in the file");

    frame.getContentPane().add(panel);
    frame.setSize(new Dimension(500, 150));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Course");
    frame.setResizable(true);
    frame.setVisible(true);

    panel.add(text);
    panel.add(textField);
    panel.add(results);

    //action listener for textfield when user hits enter
    textField.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String message;
                message = textField.getText();
            try {
                    if(message.contains("END")) {
                        System.exit(0);
                    }
                    if(message.contains("CLEAR ALL")) {
                            clear();
                    }
                    else {
                            r.write(message);
                            r.newLine();
                    }
                    r.close();
                }catch(IOException e1) {
                    results.setText("Error");
                }
            textField.setText("");
        }
    }
);

    //set focus to text field once GUI is opened
    SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            textField.requestFocus();
          }
        });
}

//clear function to empty the file
private static void clear() throws FileNotFoundException {
    File f = new File("C:/Users/User/Desktop/course.txt");
    PrintWriter w = new PrintWriter(f);
    w.print("");
    w.close();
}
}

1 Ответ

0 голосов
/ 01 марта 2019

Проблема довольно проста.Вы звоните close на BufferedWriter.

else {
   r.write(message);
   r.newLine();
}

r.close();

Javadoc для BufferedWriter#close состояний

Закрывает поток, сбрасывая его первым. После закрытия потока дальнейшие вызовы write () или flush () будут вызывать IOException .


Вы также пишете в тот жефайл с использованием двух разных объектов.Я рекомендую вам придерживаться одного и угробить другого.

...