将 System.out 重定向到 JavaFX 中的 TextArea

Posted

技术标签:

【中文标题】将 System.out 重定向到 JavaFX 中的 TextArea【英文标题】:Redirecting System.out to a TextArea in JavaFX 【发布时间】:2012-11-30 06:46:56 【问题描述】:

更新:

仍然有同样的问题,修改了主应用代码的源代码: http://pastebin.com/fLCwuMVq

CoreTest 中一定有一些东西会阻止 UI,但它会做各种各样的事情(异步 xmlrpc 请求、异步 http 请求、文件 io 等),我尝试将其全部放入 runLater 但它没有帮助.

更新 2:

我验证了代码运行并正确生成输出,但 UI 组件无法显示它很长时间

更新 3:

好的,我修好了。我不知道为什么,但没有关于 JavaFX 的指南这么说,而且它非常重要:

始终将您的程序逻辑放在与 Java FX 线程不同的线程中


我在 Swing 的 JTextArea 上工作过,但由于某种原因它不适用于 JavaFX。

我尝试调试它并在每次写入后执行 .getText() 会返回似乎正确写入的字符,但 GUI 中的实际 TextArea 没有显示任何文本。

我是不是忘记刷新了?

TextArea ta = TextAreaBuilder.create()
    .prefWidth(800)
    .prefHeight(600)
    .wrapText(true)
    .build();

Console console = new Console(ta);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);

Scene app = new Scene(ta);
primaryStage.setScene(app);
primaryStage.show();

还有Console 类:

import java.io.IOException;
import java.io.OutputStream;

import javafx.scene.control.TextArea;

public class Console extends OutputStream

    private TextArea    output;

    public Console(TextArea ta)
    
        this.output = ta;
    

    @Override
    public void write(int i) throws IOException
    
        output.appendText(String.valueOf((char) i));
    


注意:这是基于this answer 的解决方案,我删除了我不关心但未修改的位(除了从 Swing 更改为 JavaFX),它具有相同的结果:数据写入 UI 元素,屏幕上没有显示数据。

【问题讨论】:

不错的一个 - 结合答案 【参考方案1】:

您是否尝试在 UI 线程上运行它?

public void write(final int i) throws IOException 
    Platform.runLater(new Runnable() 
        public void run() 
            output.appendText(String.valueOf((char) i));
        
    );

编辑

我认为您的问题是您在 GUI 线程中运行了一些长任务,这将冻结所有内容,直到它完成。不知道是什么

CoreTest t = new CoreTest(installPath);
t.perform();

可以,但如果需要几秒钟,您的 GUI 将不会在这几秒钟内更新。您需要在单独的线程中运行这些任务。

作为记录,这很好用(我已经删除了文件和 CoreTest 位):

public class Main extends Application 

    @Override
    public void start(Stage primaryStage) throws IOException 

        TextArea ta = TextAreaBuilder.create().prefWidth(800).prefHeight(600).wrapText(true).build();
        Console console = new Console(ta);
        PrintStream ps = new PrintStream(console, true);
        System.setOut(ps);
        System.setErr(ps);
        Scene app = new Scene(ta);

        primaryStage.setScene(app);
        primaryStage.show();

        for (char c : "some text".toCharArray()) 
            console.write(c);
        
        ps.close();
    

    public static void main(String[] args) 
        launch(args);
    

    public static class Console extends OutputStream 

        private TextArea output;

        public Console(TextArea ta) 
            this.output = ta;
        

        @Override
        public void write(int i) throws IOException 
            output.appendText(String.valueOf((char) i));
        
    

【讨论】:

以上是关于将 System.out 重定向到 JavaFX 中的 TextArea的主要内容,如果未能解决你的问题,请参考以下文章

将 system.out 重定向到 logcat [重复]

使用System.out.printf()输出日志重定向到文件后显示混乱问题

重定向 System.out.println

JavaFX:将控制台输出重定向到在 SceneBuilder 中创建的 TextArea

将 SLF4J 日志重定向到 JavaFX 中的 TextArea

重定向标准输入/输出