JTextArea的append()方法似乎不起作用

时间:2012-10-21 10:00:03

标签: java swing file-io append jtextarea

我们被分配创建一个简单的编译器作为家庭作业,它将采用一组指令(包含变量,条件,跳转等)并对其进行评估。这已经完成了,但我想我会让我的程序更多......“闪亮”,并添加从文本文件加载指令的能力,只是为了用户的舒适;然而,似乎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上找到的所有现有解决方案 - 包括调用JTextArearepaint ()revalidate ()方法

我错过了什么?非常感谢您的回答!

1 个答案:

答案 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的解决方案。