java gui 控制台_在GUI面板中创建Java控制台

小编典典

这是一个正常运行的类。你可以使用以下方法将其实例安装到系统中,然后执行err:

PrintStream con=new PrintStream(new TextAreaOutputStream(...));

System.setOut(con);

System.setErr(con);

方法中正确记录和删除了文本区域中的行,run()以避免在控制台充斥输出时可能发生的追加和删除之间的竞争状况。最终结果对我来说也更干净。

import java.awt.*;

import java.io.*;

import java.util.*;

import java.util.List;

import javax.swing.*;

public class TextAreaOutputStream

extends OutputStream

{

// *************************************************************************************************

// INSTANCE MEMBERS

// *************************************************************************************************

private byte[] oneByte; // array for write(int val);

private Appender appender; // most recent action

public TextAreaOutputStream(JTextArea txtara) {

this(txtara,1000);

}

public TextAreaOutputStream(JTextArea txtara, int maxlin) {

if(maxlin<1) { throw new IllegalArgumentException("TextAreaOutputStream maximum lines must be positive (value="+maxlin+")"); }

oneByte=new byte[1];

appender=new Appender(txtara,maxlin);

}

/** Clear the current console text area. */

public synchronized void clear() {

if(appender!=null) { appender.clear(); }

}

public synchronized void close() {

appender=null;

}

public synchronized void flush() {

}

public synchronized void write(int val) {

oneByte[0]=(byte)val;

write(oneByte,0,1);

}

public synchronized void write(byte[] ba) {

write(ba,0,ba.length);

}

public synchronized void write(byte[] ba,int str,int len) {

if(appender!=null) { appender.append(bytesToString(ba,str,len)); }

}

@edu.umd.cs.findbugs.annotations.SuppressWarnings("DM_DEFAULT_ENCODING")

static private String bytesToString(byte[] ba, int str, int len) {

try { return new String(ba,str,len,"UTF-8"); } catch(UnsupportedEncodingException thr) { return new String(ba,str,len); } // all JVMs are required to support UTF-8

}

// *************************************************************************************************

// STATIC MEMBERS

// *************************************************************************************************

static class Appender

implements Runnable

{

private final JTextArea textArea;

private final int maxLines; // maximum lines allowed in text area

private final LinkedList lengths; // length of lines within text area

private final List values; // values waiting to be appended

private int curLength; // length of current line

private boolean clear;

private boolean queue;

Appender(JTextArea txtara, int maxlin) {

textArea =txtara;

maxLines =maxlin;

lengths =new LinkedList();

values =new ArrayList();

curLength=0;

clear =false;

queue =true;

}

synchronized void append(String val) {

values.add(val);

if(queue) { queue=false; EventQueue.invokeLater(this); }

}

synchronized void clear() {

clear=true;

curLength=0;

lengths.clear();

values.clear();

if(queue) { queue=false; EventQueue.invokeLater(this); }

}

// MUST BE THE ONLY METHOD THAT TOUCHES textArea!

public synchronized void run() {

if(clear) { textArea.setText(""); }

for(String val: values) {

curLength+=val.length();

if(val.endsWith(EOL1) || val.endsWith(EOL2)) {

if(lengths.size()>=maxLines) { textArea.replaceRange("",0,lengths.removeFirst()); }

lengths.addLast(curLength);

curLength=0;

}

textArea.append(val);

}

values.clear();

clear =false;

queue =true;

}

static private final String EOL1="\n";

static private final String EOL2=System.getProperty("line.separator",EOL1);

}

} /* END PUBLIC CLASS */

2020-03-16

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值