【问题标题】:JTextArea's append () method doesn't seem to workJTextArea 的 append() 方法似乎不起作用
【发布时间】:2012-10-11 09:38:22
【问题描述】:

我们被分配创建一个简单的编译器作为家庭作业,它将接受一组指令(包含变量、条件、跳转等)并评估它们。这已经完成了,但我想我会让我的程序更……“闪亮”,并添加从文本文件加载指令的能力,只是为了用户舒适;但是,似乎JTextAreaappend () 方法似乎并不喜欢我,因为它什么也没做。以下是相关代码:

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

(我使用 Awt 的 FileDialog 而不是 Swing 的 JFileChooser,因为它在 Mac 上看起来更好,如 Apple's official recommendation 所示。)

此代码中使用的input 变量指向JTextArea 实例。有趣的是——文件读取部分必须完美无缺,因为我可以看到文件内容被写入标准输出,这要归功于while 循环中的System.out.println () 调用。但是,JTextArea 中没有出现任何内容,我已经尝试了我在 StackOverflow 上找到的所有现有解决方案——包括调用 repaint ()revalidate ()updateUI () 方法。

我错过了什么?

【问题讨论】:

  • 使用JTextComponent.read(Reader,Object)绕过问题。
  • “我正在使用 Awt 的 FileDialog 而不是 Swing 的 JFileChooser,因为它在 Mac 上看起来更好......” 你在为 Windows 和 *nix 做什么?如果只针对 Mac,为什么要使用 Java 而不是 ..Cocoa 或 OS X 原生 GUI 工具包的名称?
  • “我们被分配了..一个家庭作业..这已经完成了,但我想我应该让我的程序多一点......“闪亮””我想说这之前,但被问题的技术方面分心。如果是家庭作业,时间通常最好花在提高源代码的可读性、添加(相关的)cmets 或编写证明代码的测试上。最好提交没有可见错误的编写良好的代码,而不是带有红色条纹和金色星星的代码会中断,效率低下且编写不佳。 :)
  • @AndrewThompson 我主要针对 Mac 平台,使用 Java 仅仅是因为我知道它比 Objective-C 和 Cocoa 稍微好一点:-) 我尝试使用 JTextComponent.read (Reader, Object) 但是我不确定我是不是doing it right,我可以请你再看一下我的代码吗?问题仍然存在,即使进行了此修改,我的文本区域中也没有出现任何内容。
  • 重新。新代码。将其编辑为特定于该方法的新问题。生成一个SSCCE 应该需要不到 40 行代码。

标签: java swing file-io append jtextarea


【解决方案1】:

代码可能在事件处理循环中调用,您无法在其中进行绘图。 通常会使用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2021-11-27
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多