我是靠谱客的博主 激昂棒球,最近开发中收集的这篇文章主要介绍java textarea输出_如何将输出流设置为TextArea,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MadProgrammer的解决方案非常棒,我的基础是他的。但是,正如Loopkin所指出的,它不处理特殊字符(准确地说,它在每个非ASCII字符上都失败)。

Loopkin的解决方案对我不起作用,但我最终提出了两个完成这项工作的解决方案。

解决方案1:处理每1个字节的字符(最多U + 00FF)

这个简单的解决方案可以处理U + 00FF(每个1字节字符)的每个字符。一切都与MadProgrammer相同,除了write()定义为:@Overridepublic void write(int b) throws IOException {

buffer.append(Character.toChars((b + 256) % 256));

if ((char) b == 'n') {

textArea.append(str);

textArea.setCaretPosition(textArea.getDocument().getLength());

buffer.delete(0, buffer.length());

}

old.write(b);}

我没有把前缀的东西,因为我不需要它。

解决方案2:处理每个对象,如标准输出

最后,我决定包含所有字符,所以我最终直接扩展PrintStream,并且还返回前缀/缩进。问题是我无法覆盖私有方法write(String s),所以我覆盖了所有print()方法:public class PrintStreamCapturer extends PrintStream {

private JTextArea text;

private boolean atLineStart;

private String indent;

public PrintStreamCapturer(JTextArea textArea, PrintStream capturedStream, String indent) {

super(capturedStream);

this.text = textArea;

this.indent = indent;

this.atLineStart = true;

}

public PrintStreamCapturer(JTextArea textArea, PrintStream capturedStream) {

this(textArea, capturedStream, "");

}

private void writeToTextArea(String str) {

if (text != null) {

synchronized (text) {

text.setCaretPosition(text.getDocument().getLength());

text.append(str);

}

}

}

private void write(String str) {

String[] s = str.split("n", -1);

if (s.length == 0)

return;

for (int i = 0; i 

writeWithPotentialIndent(s[i]);

writeWithPotentialIndent("n");

atLineStart = true;

}

String last = s[s.length - 1];

if (!last.equals("")) {

writeWithPotentialIndent(last);

}

}

private void writeWithPotentialIndent(String s) {

if (atLineStart) {

writeToTextArea(indent + s);

atLineStart = false;

} else {

writeToTextArea(s);

}

}

private void newLine() {

write("n");

}

@Override

public void print(boolean b) {

synchronized (this) {

super.print(b);

write(String.valueOf(b));

}

}

@Override

public void print(char c) {

synchronized (this) {

super.print(c);

write(String.valueOf(c));

}

}

@Override

public void print(char[] s) {

synchronized (this) {

super.print(s);

write(String.valueOf(s));

}

}

@Override

public void print(double d) {

synchronized (this) {

super.print(d);

write(String.valueOf(d));

}

}

@Override

public void print(float f) {

synchronized (this) {

super.print(f);

write(String.valueOf(f));

}

}

@Override

public void print(int i) {

synchronized (this) {

super.print(i);

write(String.valueOf(i));

}

}

@Override

public void print(long l) {

synchronized (this) {

super.print(l);

write(String.valueOf(l));

}

}

@Override

public void print(Object o) {

synchronized (this) {

super.print(o);

write(String.valueOf(o));

}

}

@Override

public void print(String s) {

synchronized (this) {

super.print(s);

if (s == null) {

write("null");

} else {

write(s);

}

}

}

@Override

public void println() {

synchronized (this) {

newLine();

super.println();

}

}

@Override

public void println(boolean x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(char x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(int x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(long x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(float x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(double x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(char x[]) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(String x) {

synchronized (this) {

print(x);

newLine();

super.println();

}

}

@Override

public void println(Object x) {

String s = String.valueOf(x);

synchronized (this) {

print(s);

newLine();

super.println();

}

}}

我删除了Consumer方面以保持简单,但实际需要的一切都在这里。以下是我使用这个类的方法:System.setOut(new PrintStreamCapturer(logTextArea, System.out));

System.setErr(new PrintStreamCapturer(logTextArea, System.err, "[ERROR] "));

最后

以上就是激昂棒球为你收集整理的java textarea输出_如何将输出流设置为TextArea的全部内容,希望文章能够帮你解决java textarea输出_如何将输出流设置为TextArea所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部