我们被分配创建一个简单的编译器作为家庭作业,它将采用一组指令(包含变量,条件,跳转等)并对其进行评估。这已经完成了,但我想我会让我的程序更多......“闪亮”,并添加从文本文件加载指令的能力,只是为了用户的舒适;然而,似乎JTextArea
的{{1}}方法似乎并不像我一样,因为它确实没有。这是相关的代码:
append ()
(我正在使用Awt的FileDialog而不是Swing的JFileChooser,因为它在Mac上看起来更好,如Apple's official recommendation中所示。)
此代码中使用的BufferedReader bufferedReader;
File file;
FileDialog fileDialog = new FileDialog (new Frame (), "Open File", FileDialog.LOAD);
String line;
fileDialog.setVisible (true);
if (fileDialog.getFile () != null) {
file = new File (fileDialog.getDirectory () + fileDialog.getFile ());
input.setText (""); // delete old first
try {
bufferedReader = new BufferedReader (new FileReader (file));
line = bufferedReader.readLine ();
while (line != null) {
input.append (line);
System.out.println (line);
line = bufferedReader.readLine ();
}
} catch (IOException ioe) {
ioe.printStackTrace ();
}
}
变量指向JTextArea实例。有趣的是 - 文件读取部分必须完美无缺,因为我可以看到文件内容被写入标准输出,这要归功于input
循环中的System.out.println ()
调用。但是,while
中没有显示任何内容,我已经尝试了我在StackOverflow上找到的所有现有解决方案 - 包括调用JTextArea
,repaint ()
和revalidate ()
方法
我错过了什么?非常感谢您的回答!
答案 0 :(得分:5)
可能在事件处理循环中调用代码,您无法进行绘图。 通常会使用
final String line = bufferedReader.relineadLine();
// final+local var so usable in Runnable.
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
input.append(line + "\n");
}
}
不幸的是,它需要注意放置invokeLatere的位置(作为循环)。更好地使用@ AndrewThompson的解决方案。