概述
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复