Я пытаюсь использовать графический интерфейс для записи в текстовый файл. Я столкнулся с проблемой при этом и смог понять, что 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);
}
}
});
}
}
Я полагаю, что ваша проблема проистекает из этой строки (если 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);
. Если бы вы захотели повторно использовать фрейм в будущем, не было бы слишком много накладных расходов.
Не закрывайте окно во время выполнения метода. Если вы хотите скрыть окно, вместо этого используйте setVisible(false)
. Закройте его после завершения вашего метода