2016-08-11 2 views
0

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.

+0

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

+0

'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

+0

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

Antwort

2

Swing führt die Aktionen synchron im selben Thread aus, der die GUI-Eingabe und das Rendern behandelt. Das bedeutet, dass beim Klicken auf die Schaltfläche darauf gewartet wird, dass der Aktionslistener ausgeführt wird, bevor die Eingabe verarbeitet und die GUI gezeichnet wird. In diesem Fall wird das Ausführen der GUI effektiv gestoppt, bis Sie etwas in die Konsole eingeben.

Sie können SwingWorker verwenden, um es asynchron auszuführen, damit es weiterhin die GUI ausführt, während es die Aktion ausführt.

0

Das Problem ist, dass Java, wenn Sie die Taste drücken, erwartet, Daten aus System.ini (Konsole) zu lesen.

Versuchen Sie, Ihre Anwendung mit dem Befehl java auf einer Konsole zu starten. Geben Sie dann nach Drücken der Taste einen Text in die Konsole ein und drücken Sie die Eingabetaste. Dein Programm arbeitest du.

0

Ich habe mein Problem behoben, indem ich textArea.getText() anstelle von Scanner verwendet habe.