如何使用JFrame在新窗口中打印java控制台?

如何使用JFrame在新窗口中打印java控制台?,java,javafx,jframe,Java,Javafx,Jframe,我一直在做一个项目,就功能而言,它完全可以工作,但我只是把它打印到控制台上。我想用JFrame在一个新窗口中打印它,这样我就可以用它生成一个jar文件,并让它在不需要ide的情况下运行。如何将JFrame或其他工具添加到现有代码中,使其在新窗口中打印文本?Swing。。。 在中实施 JavaFX 上述实现的“非常基本”示例 import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; im

我一直在做一个项目,就功能而言,它完全可以工作,但我只是把它打印到控制台上。我想用JFrame在一个新窗口中打印它,这样我就可以用它生成一个jar文件,并让它在不需要ide的情况下运行。如何将JFrame或其他工具添加到现有代码中,使其在新窗口中打印文本?

Swing。。。 在中实施

JavaFX 上述实现的“非常基本”示例

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Date;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextArea textArea = new TextArea();

        PrintStream ps = System.out;
        System.setOut(new PrintStream(new StreamCapturer("STDOUT", new Consumer() {
            @Override
            public void appendText(String text) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        textArea.appendText(text);
                    }
                });
            }
        }, ps)));

        BorderPane root = new BorderPane(textArea);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Just going to output the current time");
                try {
                    while (true) {
                        Thread.sleep(1000);
                        System.out.println(new Date());
                    }
                } catch (InterruptedException ex) {
                }
            }
        });
        t.setDaemon(true);
        t.start();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public interface Consumer {

        public void appendText(String text);
    }

    public class StreamCapturer extends OutputStream {

        private StringBuilder buffer;
        private String prefix;
        private Consumer consumer;
        private PrintStream old;

        public StreamCapturer(String prefix, Consumer consumer, PrintStream old) {
            this.prefix = prefix;
            buffer = new StringBuilder(128);
            buffer.append("[").append(prefix).append("] ");
            this.old = old;
            this.consumer = consumer;
        }

        @Override
        public void write(int b) throws IOException {
            char c = (char) b;
            String value = Character.toString(c);
            buffer.append(value);
            if (value.equals("\n")) {
                consumer.appendText(buffer.toString());
                buffer.delete(0, buffer.length());
                buffer.append("[").append(prefix).append("] ");
            }
            old.print(c);
        }
    }

}

仅供参考:JavaFX和
JFrame
是两种不同的技术,虽然建议的重复技术适用于Swing,但它应该(或多或少)易于修改以使用JavaFX运行。最终,更好的解决方案是使用适当的日志API