【发布时间】:2010-12-12 16:29:37
【问题描述】:
你好 是否可以在 JPanel 中绘制 java 控制台返回的内容? 你有教程吗? 谢谢 切换
【问题讨论】:
-
您可能希望在您的问题标签中添加“Swing”以吸引论坛 Swing 专家。 :)
你好 是否可以在 JPanel 中绘制 java 控制台返回的内容? 你有教程吗? 谢谢 切换
【问题讨论】:
我不记得我在哪里找到的,但我已经使用一个名为 TextAreaOutputStream 的类将输出流输出到 JPanel 中保存的 JTextArea:
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class TextAreaOutputStream extends OutputStream {
private final JTextArea textArea;
private final StringBuilder sb = new StringBuilder();
private String title;
public TextAreaOutputStream(final JTextArea textArea, String title) {
this.textArea = textArea;
this.title = title;
sb.append(title + "> ");
}
@Override
public void flush() {
}
@Override
public void close() {
}
@Override
public void write(int b) throws IOException {
if (b == '\r')
return;
if (b == '\n') {
final String text = sb.toString() + "\n";
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.append(text);
}
});
sb.setLength(0);
sb.append(title).append("> ");
}
sb.append((char) b);
}
}
然后,正如 Alex 在上面的回答中提到的那样,我将标准输出 Stream 重定向到该对象。
【讨论】:
sb.append(title).append("> "); 可能会更有效率。
首先从控制台读取。为此,请使用 System.setOut()。使用 ByteOutputStream,在那里写入并从中读取。您将得到您的程序打印到系统的内容。现在使用 TextArea 或 JScrollPane 来呈现文本。
【讨论】:
创建 FilterOutputStream 的子类以将所有内容回显到 JTextArea。
class Echo extends FilterOutputStream {
private final JTextArea text;
public Echo(OutputStream out, JTextArea text) {
super(out);
if (text == null) throw new IllegalArgumentException("null text");
this.text = text;
}
@Override
public void write(int b) throws IOException {
super.write(b);
text.append(Character.toString((char) b));
// scroll to end?
}
// overwrite the other write methods for better performance
}
并替换标准输出:
JTextArea text = new JTextArea();
System.setOut(new PrintStream(new Echo(System.out, text)));
【讨论】:
Message Console 提供了更多您可能感兴趣的选项。
【讨论】: