我正在尝试使用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);
}
}
});
}
}
答案 0 :(得分:4)
我相信你的问题源于这一行(假设input.frame相当于你在这里创建的框架)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
来自API
EXIT_ON_CLOSE(在JFrame中定义):使用System exit方法退出应用程序。仅在应用程序中使用它。
这一切意味着当你抛出WindowClosing事件时,框架(正确地)试图关闭它自己。这反过来调用默认的关闭操作,恰好是EXIT_ON_CLOSE,它在那里调用System.exit()
。这样就可以在不执行任何代码行的情况下结束程序。您可能正在寻找的是WindowConstants.DISPOSE_ON_CLOSE
而不是Frame.EXIT_ON_CLOSE
,它应关闭窗口并在不退出程序的情况下处置其资源。
虽然老实说,通过Frame.setVisible(false);
隐藏窗口可能更有意义。如果你想在将来重复使用这个框架,那么启动它就不会有太大的开销。
答案 1 :(得分:0)
在方法执行期间不要关闭窗口。如果要隐藏窗口,请改用setVisible(false)
。完成方法后关闭它