Java Swing按钮冻结程序

Java Swing按钮冻结程序,java,swing,button,freeze,event-dispatch-thread,Java,Swing,Button,Freeze,Event Dispatch Thread,我在Swing中编写了一个简单的应用程序,将文本写入文件。这是我的主要课程: import javax.swing.JFrame; import javax.swing.SwingUtilities; public class WritingTextToFileApp { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void ru

我在Swing中编写了一个简单的应用程序,将文本写入文件。这是我的主要课程:

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);
            }
        });

    }
}
这是另一节课:

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);
}
}


每当我按下按钮,程序就会冻结,什么也没发生。代码有问题吗?我是Swing新手,希望您能提供帮助。

Swing在处理GUI输入和渲染的同一线程中同步运行操作。这意味着,当您单击按钮时,它将等待操作侦听器完成运行,然后再返回到处理输入和绘制GUI。在这种情况下,它会有效地阻止GUI运行,直到您在控制台中键入内容为止


您可以使用异步运行它,以便它在运行操作时继续运行GUI。

Swing在处理GUI输入和呈现的同一线程中同步运行操作。这意味着,当您单击按钮时,它将等待操作侦听器完成运行,然后再返回到处理输入和绘制GUI。在这种情况下,它会有效地阻止GUI运行,直到您在控制台中键入内容为止


您可以使用异步运行它,以便它在运行操作时继续运行GUI。

问题在于,当您按下按钮时,java希望从System.ini(控制台)读取数据


尝试在控制台上使用java命令启动应用程序。然后在按下按钮后在控制台中输入一些文本,然后按enter键。您的程序正在运行。

问题是,当您按下按钮时,java希望从System.ini(控制台)读取数据


尝试在控制台上使用java命令启动应用程序。然后在按下按钮后在控制台中输入一些文本,然后按enter键。您的程序可以正常运行。

我使用textArea.getText()而不是scanner解决了我的问题。

我使用textArea.getText()而不是scanner解决了我的问题。

您正在阻塞管理GUI的线程,并等待从用户处读取(控制台)输入。你应该用一个字母代替。这将打开一个窗口来输入信息,并且不会冻结GUI。
String input=scanner.nextLine()
是一个阻塞操作,它将在EDT(同时处理Swing GUI的事件调度程序线程)中执行。因此,既然
扫描器
应该从
系统中读取。在
中,GUI线程将等待您通过System.in(通常是控制台)提供一些数据。您是在尝试从文本区域获取文本,还是让人们在控制台中键入文本,然后写入
Test.txt
?如果要从文本区域获取文本,请执行
TextArea.getText()
,然后从该文本写入文件。像这样拆分它
字符串行[]=textArea.getText().Split(\\n”)和横穿行。您正在阻塞管理GUI的线程,并等待从用户处读取(控制台)输入。你应该用一个字母代替。这将打开一个窗口来输入信息,并且不会冻结GUI。
String input=scanner.nextLine()
是一个阻塞操作,它将在EDT(同时处理Swing GUI的事件调度程序线程)中执行。因此,既然
扫描器
应该从
系统中读取。在
中,GUI线程将等待您通过System.in(通常是控制台)提供一些数据。您是在尝试从文本区域获取文本,还是让人们在控制台中键入文本,然后写入
Test.txt
?如果要从文本区域获取文本,请执行
TextArea.getText()
,然后从该文本写入文件。像这样拆分它
字符串行[]=textArea.getText().Split(\\n”)和横线。