Ich schrieb eine einfache Anwendung in Swing, die Text in eine Datei schreibt. Hier ist meine Hauptklasse:Java Swing-Taste friert Programm ein
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class WritingTextToFileApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new MainFrame("Application");
frame.setSize(500, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
Hier ist die andere Klasse:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class MainFrame extends JFrame {
public MainFrame(String title) {
super(title);
//Set Layout Manager
setLayout(new BorderLayout());
//Create Swing Components
JTextArea textArea = new JTextArea();
JButton button = new JButton("Add");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
File file = new File("C:\\Users\\Vincent Wen\\Desktop\\Test.txt");
try (BufferedWriter br = new BufferedWriter(new FileWriter(file))) {
br.write(input);
br.newLine();
} catch (IOException ex) {
System.out.println("Unable to write to file:" + file.toString());
}
}
});
//Add Swing components to conent pane
Container c = getContentPane();
c.add(textArea, BorderLayout.CENTER);
c.add(button, BorderLayout.SOUTH);
}
}
Jedes Mal, wenn ich die Taste drücken, das Programm friert ein und es passiert nichts. Stimmt etwas nicht mit dem Code? Ich bin neu in Swing, also würde jede Hilfe geschätzt werden.
Sie blockieren den Thread, der die GUI verwaltet, und warten darauf, Eingaben des Benutzers zu lesen (Konsole). Sie sollten stattdessen einen [Eingabedialog] (https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html#input) verwenden. Dadurch wird ein Fenster zum Eingeben der Informationen angezeigt, und die GUI wird nicht eingefroren. – resueman
'String input = scanner.nextLine();' blockiert den Vorgang und wird im EDT (Event-Dispatcher-Thread, der auch die Swing-GUI bedient) ausgeführt. Da 'scanner' von' System.in' lesen soll, wird Ihr GUI-Thread warten, bis Sie einige Daten über System.in (in der Regel Konsole) zur Verfügung stellen. – Pshemo
Versuchen Sie, den Text von Ihrem TextArea zu bekommen oder Leute in die Konsole tippen zu lassen, um dann in 'Test.txt' zu schreiben? Wenn Sie den Text aus Ihrer TextArea holen wollen, tun Sie 'textArea.getText()' und schreiben Sie dann von diesem Text in Ihre Datei. Teilen Sie es wie folgt auf: 'String lines [] = textArea.getText(). Split ("\\ n"); 'und quer über Linien. – Dominic