【发布时间】: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