【问题标题】:Java Swing button freezes programJava Swing 按钮冻结程序
【发布时间】:2016-12-18 15:31:28
【问题描述】:

我在 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 新手,因此我们将不胜感激。

【问题讨论】:

  • 您正在阻塞管理 GUI 的线程,并等待从用户那里读取(控制台)输入。您应该改用input dialog。这将打开一个窗口来输入信息,并且不会冻结 GUI。
  • String input = scanner.nextLine(); 是阻塞操作,它将在 EDT(也处理 Swing GUI 的事件调度程序线程)中执行。因此,由于scanner 应该从System.in 读取,您的 GUI 线程将等待您通过 System.in(通常是控制台)提供一些数据。
  • 您是想从 TextArea 中获取文本,还是让人们在控制台中输入然后写信给 Test.txt?如果您想从 TextArea 获取文本,请执行 textArea.getText(),然后从该文本写入您的文件。像这样String lines[] = textArea.getText().split( "\\n" ); 拆分它并横穿线条。

标签: java swing button freeze event-dispatch-thread


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    尝试在控制台上使用 java 命令启动您的应用程序。然后在按下按钮后在控制台中输入一些文本并按回车。你工作的程序。

    【讨论】:

      【解决方案3】:

      我通过使用 textArea.getText() 而不是扫描仪解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2016-02-10
        • 2012-06-26
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多