Printstream in JTextArea ausgeben

raptot

Mitglied
Hallo,
ich möchte eine Klasse schreiben, die es mir erlaubt einen PrintStream in einer TextArea auzugeben.
Genauer gesagt geht es drum die Konsolenausgabe umzuleiten. Wie ich System.out umleite weiss ich bereits.

Allerdings funktioniert mein Code nicht.
Die Klasse soll sich genau wie System.out handhaben lassen also zum Beispiel consoleoutput.out.println("Hello World"); sollte dann den String in der TextArea erscheinen lassen.
Ich wollte einen Thread erstellen, der einfach den Stream liest und dann ausgibt, aber das funktioniert nicht.

Das einzige was mir noch einfällt, ist von Printstream zu erben und alle Methoden selbst zu implementieren, aber das ist aufwendig.

Wie kann ich das bewerkstelligen?

mfg
Raptor

Code:
package toolbox.gui;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JConsoleOutput extends JPanel implements Runnable {

    /**
     * 
     */
    private static final long serialVersionUID = 8376234470027268278L;
    private JTextArea outputfield;
    private ByteArrayOutputStream baos = new ByteArrayOutputStream();

    public final PrintStream out;

    private boolean stopflag;

    public JConsoleOutput(int rows, int columns) throws IOException {
        super();

        outputfield = new JTextArea(rows, columns);
        this.add(new JScrollPane(outputfield));

        out = new PrintStream(baos);

        new Thread(this).start();
    }

    public void stop() {
        stopflag = true;
    }

    @Override
    public void run() {
        while (!stopflag) {
            StringBuffer buffer = new StringBuffer();
            buffer.append(new String(baos.toByteArray()));
            buffer.append("\n");
            outputfield.append(buffer.toString());

            baos.reset();
        }

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        try {
            JConsoleOutput cons = new JConsoleOutput(20, 60);
            frame.add(cons);
            frame.pack();
            frame.setVisible(true);

            for (int i = 0; i <= 20; i++) {
                cons.out.println("Test is a test of my new Stream class " + i);
            }
            cons.stop();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
 
Also wenn ich mich nicht irre, sollte es reichen die eine Methode von PrintStream zu überschreiben. Sowas in der Art:

Java:
package de;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JConsoleOutput extends JPanel {

	/**
     * 
     */
	private static final long serialVersionUID = 8376234470027268278L;
	private JTextArea outputfield;

	public final PrintStream out;

	public JConsoleOutput(int rows, int columns) throws IOException {
		super( );

		outputfield = new JTextArea(rows, columns);
		this.add(new JScrollPane(outputfield));

		out = new Blub(outputfield);
	}

	public static class Blub extends PrintStream {

		private JTextArea area;

		public Blub(JTextArea area) {
			super(new ByteArrayOutputStream( ));
			this.area = area;
		}

		@Override
		public void write(byte[] buf, int off, int len) {
			area.append(new String(buf, off, len));
		}

	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Test");
		try {
			JConsoleOutput cons = new JConsoleOutput(20, 60);
			frame.add(cons);
			frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			frame.pack( );
			frame.setVisible(true);

			for (int i = 0; i <= 20; i++) {
				cons.out.println("Test is a test of my new Stream class " + i);
			}
		}
		catch (IOException e) {
			e.printStackTrace( );
		}

	}

}
 
Zurück