Java WindowEvent.WINDOW\u关闭会提前终止程序

Java WindowEvent.WINDOW\u关闭会提前终止程序,java,swing,jframe,Java,Swing,Jframe,我正在尝试使用GUI将数据写入文本文件。我在执行此操作时遇到了一个问题,并且能够确定WindowEvent出于某种原因提前终止了程序 最初我有outFile.close()在WindowEvent行之后,因此JTextArea中的文本不会传输到文本文件。在切换了几行代码之后,我意识到,当尝试使用WindowEvent自动关闭JFrame时,之后没有任何代码被执行 我如何解决这个问题 import ... public class TxtManager { static Input in

我正在尝试使用GUI将数据写入文本文件。我在执行此操作时遇到了一个问题,并且能够确定WindowEvent出于某种原因提前终止了程序

最初我有
outFile.close()
WindowEvent
行之后,因此JTextArea中的文本不会传输到文本文件。在切换了几行代码之后,我意识到,当尝试使用WindowEvent自动关闭JFrame时,之后没有任何代码被执行

我如何解决这个问题

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);
                }
            }
        });
    }
}
导入。。。
公共类TxtManager{
静态输入;
public static void overwriteCurrentFile()引发IOException{
TxtManager txt=新的TxtManager();
输入=新输入(txt);
}
public synchronized void sendData()引发IOException{
试一试{
BufferedWriter outFile=新的BufferedWriter(新的FileWriter(file1));
字符串数据=input.textArea.getText();
输出文件。写入(数据);
outFile.close();
input.frame.dispatchEvent(新的WindowEvent(input.frame,WindowEvent.WINDOW_关闭));
//从这一点开始,try块中的代码不会执行。
System.out.println(“完成写入…”);//用于查明问题
showMessageDialog(null,“已成功覆盖“+TxtManager.file1+”中的数据”);
TxtManager.showData=true;
TxtManager.menu2();
}捕获(例外情况除外){
showMessageDialog(null,“错误:+ex.getMessage(),“错误”,JOptionPane.Error\u消息);
}
}
}
类输入扩展线程{
TxtManager txt;
公共区域文本区域;
公共框架;
私人按钮;
公共输入(TxtManager txt)引发IOException{
this.txt=txt;
JOptionPane.showMessageDialog(null,“在GUI屏幕中输入所需数据。\n”+
“完成后按按钮。”);
frame=新JFrame(“提示”);
JPanel panel=newjpanel(newborderlayout());
框架。添加(面板);
JLabel标签=新的JLabel(“输入所需数据”);
面板。添加(标签,边框布局。北);
textArea=新的JTextArea(15,80);
panel.add(textArea,BorderLayout.CENTER);
添加(新的JScrollPane(textArea));
按钮=新按钮(“完成”);
面板。添加(按钮,边框布局。南);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
start();
}
公开募捐{
addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
试一试{
txt.sendData();
}捕获(IOEX异常){
showMessageDialog(null,“错误:+ex.getMessage(),“错误”,JOptionPane.Error\u消息);
}
}
});
}
}

我相信您的问题源于这一行(假设input.frame与您在此处创建的框架等效)

关闭时退出(在JFrame中定义):使用系统退出方法退出应用程序。仅在应用程序中使用此选项

这一切都意味着,当您抛出WindowClosing事件时,帧(正确地)会尝试自行关闭。这又调用了默认的关闭操作,该操作恰好是EXIT\u ON\u close,它在那里调用
System.EXIT()
。这将结束程序,而不执行更多的代码行。您可能要查找的是
WindowConstants。在关闭时释放,而不是在关闭时释放。在关闭时退出,这将关闭窗口并释放其资源,而无需退出程序


老实说,通过
Frame.setVisible(false)隐藏窗口可能更有意义。这样,如果您希望将来重用该框架,启动它时不会有太多开销。

我相信您的问题源于这一行(假设input.frame与您在此处创建的框架等效)

关闭时退出(在JFrame中定义):使用系统退出方法退出应用程序。仅在应用程序中使用此选项

这一切都意味着,当您抛出WindowClosing事件时,帧(正确地)会尝试自行关闭。这又调用了默认的关闭操作,该操作恰好是EXIT\u ON\u close,它在那里调用
System.EXIT()
。这将结束程序,而不执行更多的代码行。您可能要查找的是
WindowConstants。在关闭时释放,而不是在关闭时释放。在关闭时退出,这将关闭窗口并释放其资源,而无需退出程序


老实说,通过
Frame.setVisible(false)隐藏窗口可能更有意义。这样,如果您希望将来重用该帧,启动它时不会有太多开销。

在方法执行期间不要关闭窗口。如果要隐藏窗口,请改用
setVisible(false)
。完成方法后关闭它

方法执行期间不要关闭窗口。如果要隐藏窗口,请改用
setVisible(false)
。完成方法后关闭它

为什么在运行方法时关闭程序窗口?@MGorgon在输入数据后不需要该窗口。为什么在运行方法时关闭程序窗口?@MGorgon在输入数据后不需要该窗口。哇,这很有意义!谢谢你的帮助!哇,这很有道理!谢谢你的帮助!
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);