swing 将system.out输出的信息重定向到JTEXTAREA
来源:互联网 发布:laravel mac 环境 编辑:程序博客网 时间:2024/05/11 19:20
一、处理系统输出的系统重新连接填充到一个inputstream,以供第二部的JtextArea组建读取数据并显示;
具体思路:new一个新的线程处理SYSTEM.OUT的数据。通过管道输出流与输入流连接,将数据传输到一个PipedInputStream。
LoopedStreams.java
package ywcai.ls.data;
import java.io.*;
public class LoopedStreams {
private PipedOutputStream pipedOS =
new PipedOutputStream();
private boolean keepRunning = true;
private ByteArrayOutputStream byteArrayOS =
new ByteArrayOutputStream(1024) {
public void close() {
keepRunning = false;
try {
super.close();
pipedOS.close();
}
catch(IOException e) {
System.exit(1);
}
}
};
private PipedInputStream pipedIS = new PipedInputStream() {
public void close() {
keepRunning = false;
try {
super.close();
}
catch(IOException e) {
System.exit(1);
}
}
};
public LoopedStreams() throws IOException {
pipedIS.connect(pipedOS);
startByteArrayReaderThread();
}
public InputStream getInputStream() {
return pipedIS;
}
public OutputStream getOutputStream() {
return byteArrayOS;
}
private void startByteArrayReaderThread() {
new Thread(new Runnable() {
public void run() {
while(keepRunning) {
if(byteArrayOS.size() > 0) {
byte[] buffer = null;
synchronized(byteArrayOS) {
buffer = byteArrayOS.toByteArray();
byteArrayOS.reset(); // 清除缓冲区
}
try {
pipedOS.write(buffer, 0, buffer.length);
}
catch(IOException e) {
System.exit(1);
}
}
else
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}).start();
}
}
二、继承一个JTextArea类,重定向system.out数据,并读取。
package ywcai.ls.data;
import java.io.*;
import javax.swing.*;
public class ConsoleText extends JTextArea
{
private static final long serialVersionUID = 1L;
/**
*
*/
public ConsoleText() {
LoopedStreams ls = null;
try {
ls = new LoopedStreams();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintStream ps = new PrintStream(ls.getOutputStream(),true);
System.setOut(ps);
System.setErr(ps);
startConsoleReaderThread(ls.getInputStream());
}
private void startConsoleReaderThread(InputStream inStream)
{
final BufferedReader br =new BufferedReader(new InputStreamReader(inStream));
new Thread(new Runnable() {
public void run() {
StringBuffer sb = new StringBuffer();
try {
String s;
while( (s=br.readLine()) != null) {
sb.setLength(0);
append(sb.append(s).append("\n").toString());
setCaretPosition(getText().length());
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
三、在主程序创建consoleTextArea实例
代码省略;
四、问题:
处理按纽点击事件,所有的信息均需要等待按纽时间处理完成后,consoleTextArea才能显示控制台信息,而且是一次性显示;
开始一直以为是LoopedStreams 处理的方式有问题。
最后发现原因:swing在处理事件时,由于UI更新与按纽点击等事件都属于EDT类事件处理线程,需按队列进行处理,因此当时间进行耗时较长操作时就会感觉客户端无响应。
五、解决办法:
在编写点击事件处理实务代码时,新开辟一个工作线程进行处理,这样UI更新无需等待时间处理完毕,即可达到同步输出控制台信息的需求。
button_sub.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {//开辟一个工作线程
@Override
public void run() {
updateAll();//需处理的实务
}
}).start();
}
});
- swing 将system.out输出的信息重定向到JTEXTAREA
- swing重定向输出到jtextArea
- 如何将System.out的内容重定向输出到一个界面上的文本框中
- 如何将System.out的内容重定向输出到一个界面上的文本框中?
- 解惑tomcat如何将标准输出保存到文件——重定向System.out
- java重定向程序的标准输出System.out到文件
- 重定向控制台System.out.println输出到文件,再重定向回控制台
- 重定向System.out 到文件
- System.out 重定向到文件
- Java 将System.out和System.err重定向
- 将System.out.println()打印的内容输出到文件
- 将命令行的输出重定向到某个文件
- 将make的输出重定向到文件
- 关于将程序输出重定向到文件的实现
- 将cout<<的信息重定向到指定文件中
- 将标准输出重定向到GUI
- 将GRUB输出重定向到串口
- 将make 输出重定向到文件
- LeetCode题解——Trapping Rain Water
- 树(基本概念及存储结构)
- PHP:快速排序法
- 欢迎使用CSDN-markdown编辑器
- java面向对象的思想
- swing 将system.out输出的信息重定向到JTEXTAREA
- 进程状态
- LeetCode题解-Best Time to Buy and Sell Stock III
- 认识shell
- 每天一个linux命令(1):ls命令
- 一种新的Activity转换动画实现方式
- 四种支持向量机工具箱使用概念
- CSAPP LAB---MALLOC实验
- Java8对《编程导论(Java)》的影响