WindowEvent.WINDOW_CLOSING досрочно завершает программу

1

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

Первоначально у меня был outFile.close(); после строки WindowEvent, поэтому текст из JTextArea не будет передан в текстовый файл. После переключения нескольких строк кода я понял, что при попытке автоматически закрыть JFrame с помощью WindowEvent, ни один из последующих программ не будет выполнен.

Как я могу исправить эту проблему?

import ...

public class TxtManager {
    static Input input;

    public static void overwriteCurrentFile() throws IOException {
        TxtManager txt = new TxtManager();
        input = new Input(txt);
    }

    public synchronized void sendData() throws IOException {
        try {
            BufferedWriter outFile = new BufferedWriter(new FileWriter(file1));
            String data = input.textArea.getText();
            outFile.write(data);
            outFile.close();
            input.frame.dispatchEvent(new WindowEvent(input.frame,WindowEvent.WINDOW_CLOSING));
            // Code from this point on in the try block does not execute.
            System.out.println("Finished with the write out..."); // Used for pinpointing the problem
            JOptionPane.showMessageDialog(null,"Data in " + TxtManager.file1 + " has been overwritten successfully.");
            TxtManager.showData = true;
            TxtManager.menu2();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,"Error: " + ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
        }
    }
}

class Input extends Thread {
    TxtManager txt;
    public JTextArea textArea;
    public JFrame frame;
    private JButton button;

    public Input(TxtManager txt) throws IOException {
        this.txt = txt;
        JOptionPane.showMessageDialog(null,"Enter desired data into the GUI screen.\n" +
            "Press the <Done> button once you are finished.");
        frame = new JFrame("Prompt");
        JPanel panel = new JPanel(new BorderLayout());
        frame.add(panel);
        JLabel label = new JLabel("Enter desired data.");
        panel.add(label,BorderLayout.NORTH);
        textArea = new JTextArea(15,80);
        panel.add(textArea,BorderLayout.CENTER);
        panel.add(new JScrollPane(textArea));
        button = new JButton("Done");
        panel.add(button,BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        start();
    }

    public void run() {
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    txt.sendData();
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null,"Error: " + ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }
}
  • 0
    Почему вы закрываете окно программы во время работы вашего метода?
  • 0
    @MGorgon Окно не понадобится после ввода данных.
Теги:
swing
jframe

2 ответа

4
Лучший ответ

Я полагаю, что ваша проблема проистекает из этой строки (если input.frame эквивалентен кадру, который вы создаете здесь)

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Из API

EXIT_ON_CLOSE (определяется в JFrame): выход из приложения с помощью метода выхода системы. Используйте это только в приложениях.

Все это означает, что когда вы бросаете событие WindowClosing, кадр (по праву) пытается закрыть себя. Это, в свою очередь, вызывает операцию закрытия по умолчанию, которая является EXIT_ON_CLOSE, которая вызывает System.exit() прямо там. Это завершает вашу программу, не выполняя никаких строк кода. Вероятно, вы ищете WindowConstants.DISPOSE_ON_CLOSE вместо Frame.EXIT_ON_CLOSE, который должен закрыть окно и распорядиться ресурсами без выхода из вашей программы.

Хотя, честно говоря, может иметь смысл просто спрятать ваше окно через Frame.setVisible(false);. Если бы вы захотели повторно использовать фрейм в будущем, не было бы слишком много накладных расходов.

  • 0
    Вау, это имеет большой смысл! Спасибо вам за помощь!
0

Не закрывайте окно во время выполнения метода. Если вы хотите скрыть окно, вместо этого используйте setVisible(false). Закройте его после завершения вашего метода

Ещё вопросы

Сообщество Overcoder
Наверх
Меню