/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gui; import java.awt.Color; import java.io.OutputStream; import java.io.PrintStream; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; /** * * @author Pungin */ public class GUIPrintStream extends PrintStream { private final JTextPane mainComponent; private final JTextPane component; private final int type; private final int lineLimit; public static final int OUT = 0; public static final int ERR = 1; public static final int NOTICE = 2; public static final int PACKET = 3; public GUIPrintStream(OutputStream out, JTextPane mainComponent, JTextPane component, int type) { super(out); this.mainComponent = mainComponent; this.component = component; this.type = type; lineLimit = 100; } public GUIPrintStream(OutputStream out, JTextPane mainComponent, JTextPane component, int type, int lineLimit) { super(out); this.mainComponent = mainComponent; this.component = component; this.type = type; this.lineLimit = lineLimit; } @Override public void write(byte[] buf, int off, int len) { super.write(buf, off, len); final String message = new String(buf, off, len); final Color col; switch (type) { case OUT: col = Color.BLACK; break; case ERR: col = Color.RED; break; case NOTICE: col = Color.BLUE; break; case PACKET: col = Color.GRAY; break; default: col = Color.BLACK; } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { SimpleAttributeSet attrSet = new SimpleAttributeSet(); StyleConstants.setForeground(attrSet, col); Document doc = component.getDocument(); Document docMain = mainComponent.getDocument(); try { String[] docMainInfo = docMain.getText(0, docMain.getLength()).split("\r\n"); String[] docInfo = doc.getText(0, doc.getLength()).split("\r\n"); if (docMainInfo.length >= lineLimit + 1) { for (int i = 0 ; i <= docMainInfo.length - lineLimit - 1 ; i++) { docMain.remove(0, docMainInfo[i].length() + 2); } } if (docInfo.length >= lineLimit + 1) { for (int i = 0 ; i <= docInfo.length - lineLimit - 1 ; i++) { doc.remove(0, docInfo[i].length() + 2); } } docMain.insertString(docMain.getLength(), message, attrSet); doc.insertString(doc.getLength(), message, attrSet); } catch (BadLocationException e) { component.setText("輸出出錯:" + e + "\r\n內容:" + message + "\r\n類型:" + type); } } } ); } }