Implementando uma janela de console com o componente JTextArea

Este exemplo cria uma janela de console usando JTextArea. Esta janela mostra toda a saída de dados para System.out e a System.err. Para isso, duas threads de leitura são criadas para recuperar a saída de dados e adicioná-los no componente JTextArea.

import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; public class Console extends JFrame { PipedInputStream piOut; PipedInputStream piErr; PipedOutputStream poOut; PipedOutputStream poErr; JTextArea textArea = new JTextArea(); public Console() throws IOException { // Configura System.out piOut = new PipedInputStream(); poOut = new PipedOutputStream(piOut); System.setOut(new PrintStream(poOut, true)); // Configura System.err piErr = new PipedInputStream(); poErr = new PipedOutputStream(piErr); System.setErr(new PrintStream(poErr, true)); // Adiciona barra de rolagem na área de texto
textArea.setEditable(false); textArea.setRows(20); textArea.setColumns(50); getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER); pack(); setVisible(true); // Cria as threads de leitura
new ReaderThread(piOut).start(); new ReaderThread(piErr).start(); } class ReaderThread extends Thread { PipedInputStream pi; ReaderThread(PipedInputStream pi) { this.pi = pi; } public void run() { final byte[] buf = new byte[1024]; try { while (true) { final int len = pi.read(buf); if (len == -1) { break; } SwingUtilities.invokeLater(new Runnable() { public void run() { textArea.append(new String(buf, 0, len)); // Mantém a última linha sempre visível
textArea.setCaretPosition(textArea.getDocument().getLength()); // Mantém a área do texto para um determinado tamanho de caractere
int idealSize = 1000; int maxExcess = 500; int excess = textArea.getDocument().getLength() - idealSize; if (excess >= maxExcess) { textArea.replaceRange("", 0, excess); } } }); } } catch (IOException e) { } } } }

O console é criado usando o código abaixo:

try { new Console(); } catch (IOException e) { }