gpt4 book ai didi

java - 如何将多个类中的多个 system.out.println() 显示到单个 GUY(如 JTextArea)中

转载 作者:行者123 更新时间:2023-12-01 18:02:25 25 4
gpt4 key购买 nike

如何将多个类中的多个 systen.out.println() 显示到单个 GUI(如 JTextArea)中。

嗨,我正在做一个学校项目,其中有几个类具有 system.out.println() 来显示控制台输出。但是现在我需要将控制台输出显示到 GUI 中。

例如第一类有 system.out.println("第一类");第二类有 system.out.println("class 2");

我有一个 GUI 类,guiJava.class,其中包含 JtextArea。

有人知道怎么做吗?

我网上看的就是使用这段代码:

    PrintStream standardOut;

PrintStream printStream = new PrintStream(new CustomOutputStream(jTextArea1));

// keeps reference of standard output stream
standardOut = System.out;

// re-assigns standard output stream and error output stream
System.setOut(printStream);
System.setErr(printStream);

但这似乎只显示 guiJava.class 中的 System.out.println(),而不是类 1 和类 2 中的所有 sysout 行。

最佳答案

这是一个使用 PipedOutputStream 的示例(代码大量借用于 this post。)

import javax.swing.*;
import java.awt.*;
import java.io.*;

public class TextAreaPrinter extends JFrame {

private JTextArea outputArea;
private JScrollPane outputScrollPane;

public TextAreaPrinter() {
setTitle("TextAreaPrinter");
setSize(640, 480);
setMinimumSize(new Dimension(640,480));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

outputArea = new JTextArea();
outputArea.setEditable(false);
outputScrollPane = new JScrollPane(outputArea);
outputScrollPane.setPreferredSize(new Dimension(250, 250));
outputScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

add(outputScrollPane);

setVisible(true);
}

public static void main(String[] args) {
TextAreaPrinter textAreaPrinter = new TextAreaPrinter();

try {
PrintStream out = new PrintStream(new MyOutputStream(textAreaPrinter.outputArea), true, "UTF-8");
System.setOut(out);
} catch (IOException ioe) {
textAreaPrinter.outputArea.append(ioe.getMessage());
}

System.out.println("class one");
System.out.println("class 2");
}
}

class MyOutputStream extends OutputStream {

private PipedOutputStream out = new PipedOutputStream();
private Reader reader;
private JTextArea outputArea;

public MyOutputStream(JTextArea outputArea) throws IOException {
this.outputArea = outputArea;
// Set the input to be piped to our output stream
PipedInputStream in = new PipedInputStream(out);
reader = new InputStreamReader(in, "UTF-8");
}

public void write(int i) throws IOException {
out.write(i);
}

public void write(byte[] bytes, int i, int i1) throws IOException {
out.write(bytes, i, i1);
}

public void flush() throws IOException {
if (reader.ready()) {
char[] chars = new char[1024];
int n = reader.read(chars);

String text = new String(chars, 0, n);
// Write the text to the JTextArea
outputArea.append(text);
}
}
}

如果运行此命令,您将看到 main(...) 函数中对 System.out.println(...) 的调用打印到 JTextArea.

此外,如果您已经拥有大部分 GUI 并且不需要所有这些代码,您只需创建一个 JTextArea,代码的关键部分是这样的:

try {
PrintStream out = new PrintStream(new MyOutputStream(textAreaPrinter.outputArea), true, "UTF-8");
System.setOut(out);
} catch (IOException ioe) {
textAreaPrinter.outputArea.append(ioe.getMessage());
}

运行上面的代码片段后,对 System.out.println(...) 的所有调用都应转到 JTextArea

关于java - 如何将多个类中的多个 system.out.println() 显示到单个 GUY(如 JTextArea)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60607513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com