求将System.out的打印信息重定向至JTextArea的思路

westwin 2005-05-12 09:25:12
入题所述,
...全文
346 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chongkai 2005-05-12
  • 打赏
  • 举报
回复
updn(快乐编程) 的办法比我的简单。自己写了个OutputStream,挺好。我本来想继承一个,但是访问不到它的buffer,所以才用了piped。

有点建议:
1 每次write之后直接flush,而不要等到buffer满了之后
2 OutputStream的几个write方法都应该覆盖
chongkai 2005-05-12
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.io.*;
import java.awt.event.*;

class MyPipe implements Runnable{
private JTextArea textarea;
private PipedInputStream pis = new PipedInputStream();
private PipedOutputStream pos;
private BufferedReader reader = new BufferedReader(
new InputStreamReader(pis));
private Thread thread = null;

public MyPipe(JTextArea ta) throws IOException{
textarea = ta;
pos = new PipedOutputStream(pis);
thread = new Thread(this);
thread.start();
}

public PipedOutputStream getOut(){
return pos;
}

public void run(){
String line = null;
while(thread == Thread.currentThread()){
try{
line = reader.readLine();
}
catch(IOException ioe){
break;
}

if(line == null){
break;
}
else{
final String s = line;
SwingUtilities.invokeLater(new Runnable(){
public void run(){
textarea.append(s);
textarea.append(System.getProperty("line.separator", "\n\r"));
}
});
}
}
}

public void close(){
thread = null;
}
}

public class Sink extends JFrame{
private MyPipe pipe;

public Sink() throws IOException{
JTextArea area = new JTextArea(10, 40);
area.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println(e.getX() + ", " + e.getY());
}
});

JScrollPane scroll = new JScrollPane(area);
pipe = new MyPipe(area);
System.setOut(new PrintStream(pipe.getOut(), true));
this.getContentPane().add(scroll, BorderLayout.CENTER);
this.pack();
this.setLocation(200, 200);
this.setVisible(true);
}

public void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID() == e.WINDOW_CLOSING){
pipe.close();
System.exit(0);
}
}

public static void main(String[] args)throws IOException{
Sink sink = new Sink();
}
}
updn 2005-05-12
  • 打赏
  • 举报
回复
PrintStream ps = new PrintStream(new OutputStream(){

final int LENGTH = 256;
byte[] bb = new byte[LENGTH];
int p = 0;
public void write(int b) throws IOException {
bb[p++] = (byte)b;

if(p >= LENGTH){
flush();
}
}

public void flush()throws IOException{
String str = new String(bb,0,p);

jTextArea1.append(str);

p = 0;
}
},true);

System.setOut(ps);

System.out.println("test str"};
westwin 2005-05-12
  • 打赏
  • 举报
回复
1楼的代码好像不起效果,不过看起来很正确
MARS.nEIL 2005-05-12
  • 打赏
  • 举报
回复
UP.学习.
bevin1010 2005-05-12
  • 打赏
  • 举报
回复
jtextOut = new OutputStream() {

final int BUFFER_LENGTH = 1024;
byte buf[] = new byte[BUFFER_LENGTH];
int pos = 0;
public void write(int b) throws IOException {
buf[pos ++] = (byte)b;
if (pos >= BUFFER_LENGTH)
flush();
}

public void flush() throws IOException
{
if (pos >= BUFFER_LENGTH)
txtLog.append(new String(buf));
else
txtLog.append(new String(buf, 0, pos));
pos = 0;
}
};
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
//output message to textarea
System.setOut(new PrintStream(jtextOut, true));
aid666 2005-05-12
  • 打赏
  • 举报
回复
不懂....
可不可以将Area的内容装到一个OutputStream中?之后用这个进行输出?
如何将一个OutputStream定为默认输出流,等待高手 。。。
Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释执行命令的使用10 1.2.5UltraEdit的使用11 1.3一个简单的Java应用程序14 1.4一个简单的Java小程序16 1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型数据29 2.3.6字符型数据30 2.3.7布尔型数据32 2.3.8变量赋初值33 2.3.9变量的作用域34 2.3.10数据类型转换34 2.4运算符与表达式37 2.4.1算术运算符和算术表达式38 2.4.2关系运算符和关系表达式43 2.4.3逻辑运算符和逻辑表达式44 2.4.4条件运算符和条件表达式48 2.4.5位运算符和位运算表达式50 2.4.6赋值运算符和赋值表达式53 2.4.7表达式的值顺序55 2.5流程控制语句58 2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句60 2.5.4if~else分支语句61 2.5.5多路分支switch~case语句69 2.5.6当型循环while语句71 2.5.7直到型循环do~while语句72 2.5.8当型循环for语句74 2.5.9循环的嵌套78 2.5.10跳转语句break80 2.5.11跳转语句continue82 2.6程序文本的风格84 2.6.1注释84 2.6.2程序的格式编排87 2.7基础语法实战演习88 2.7.1判断闰年88 2.7.2最大公约数和最小公倍数89 2.7.3Fibonacci数列90 2.7.4逆向输出数字91 2.7.5水仙花数92 2.7.6输出图形93 2.7.7输出九九口诀表94 2.8本章小结95 第2篇Java面向对象编程 第3章对象和类98 3.1面向对象的基本概念98 3.1.1对象98 3.1.2类99 3.1.3消息101 3.1.4面向对象的4个基本特征101 3.2类与对象104 3.2.1类的基本结构104 3.2.2类的声明104 3.2.3创建类体105 3.2.4对象的生命周期106 3.2.5对象的创建106 3.2.6对象的使用108 3.2.7对象的释放和垃圾收集机制108 3.3成员变量的定义与使用109 3.3.1成员变量的定义109 3.3.2成员变量的访问权限110 3.3.3实例成员变量和静态成员变量114 3.4方法的定义和实现116 3.4.1方法的声明117 3.4.2创建方法体与return语句117 3.4.3局部变量和成员变量的区别119 3.4.4方法的访问权限121 3.5方法的调用121 3.5.1方法调用的形式121 3.5.2方法调用的参数123 3.5.3隐含参数this127 3.6构造方法128 3.6.1无参数构造方法的定义和使用129 3.6.2带参数构造方法的定义和使用131 3.6.3this关键字和构造方法的调用132 3.7静态方法133 3.7.1静态方法的声明和定义134 3.7.2静态方法和实例方法的区别134 3.7.3静态代码块136 3.7.4再论静态成员变量137 3.8main()方法和命令行参数139 3.9结束方法141 3.10本地方法141 3.11本章小结144 第4章继承与多态145 4.1继承的基本原理145 4.2子类对父类的继承146 4.3属性隐藏和方法的覆盖148 4.3.1属性的隐藏148 4.3.2方法的覆盖151 4.4构造方法的继承154 4.5super的使用156 4.5.1用super引用父类的成员156 4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8载159 4.8.1普通方法的载160 4.8.2构造方法的载161 4.8.3载的解析163 4.8.4载与覆盖的区别165 4.9运行时多态165 4.9.1实例方法的运行时多态165 4.9.2成员变量运行时的表现167 4.9.3静态方法运行时

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧