# Wie kann ich alle System.out Strings in ein log window umleiten?



## myaxelb (16. Apr 2009)

Hallo zusammen!

Man stelle sich eine SWT application in java vor. Ich drücke bei dieser Anwendung auf einen Start-Knopf, und das Prog (umfasst mehrere Klassen und Pakete) fängt an zu laufen. Im Console window von Eclipse sehe ich auch alle System.out Ausgaben aus allen Klassen. Nun will ich folgendes machen:
Beim Starten des Progs (Start Button drücken) soll ein logging window (window mit text area oder so) aufpoppen und ALLE System.out ausgaben aus ALLEN Klassen sollen nun in mein logging window umgeleitet werden!!
KANN MIR JEMAND HELFEN?????:L

Vielen Dank!


----------



## E.G.O. (16. Apr 2009)

weiß grad auch nich genau wie das funzt, aber ich glaube du musst den OUTPUT-STREAM auf deine textarea legen, 
input_stream_textarea = output_stream


----------



## Der Müde Joe (16. Apr 2009)

> ALLE System.out ausgaben aus ALLEN Klassen

System (Java Platform SE 6)

Den out umsetzten..dothin wo du möchtest


----------



## myaxelb (16. Apr 2009)

Hallo nochmals!

Danke für die Ratschläge! Ich würde euch bitten, etwas genauer zu sein, evtl. Code-Beispiele zu bringen, denn ich bin ANFÄNGER!!

Besten Dank!


----------



## Der Müde Joe (16. Apr 2009)

>Code-Beispiele

klar doch..


```
import java.io.PrintStream;

import javax.swing.JFrame;

public class Use {

	public static void main(String[] args) {
		PrintStream someOtherStream = new PrintStream(System.out) {

			@Override
			public void println(String s) {
				JFrame frame = new JFrame();
				frame.setSize(500, 500);
				frame.setTitle(s);
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		};

		// System.out umlenken:
		System.setOut(someOtherStream);

		System.out.println("test");
		System.out.println("some other test");
	}
}
```


----------



## myaxelb (17. Apr 2009)

Hallo!

Klingt gut. Wie rufe ich nun aber diese Klasse aus verschiedenen anderen Klassen auf?
Wenn ich 10 Klassen habe wo ich System.out Strings habe und diese in ein Fenster umleiten möchte, dann will ich ja nicht 10x deine Use Klasse aufrufen müssen. Damit hätte ich ja 10 Fenster, oder?
Ich brauche EIN Fenster, das permanent offen ist, und ich muss irgendwie aus allen Klassen darauf zugreifen können,  um den System.out Text einfügen zu können... das habe ich noch nicht verstanden wie das gehen soll...???:L

Erklärungen und Code Beispiele super willkommen! Vielen dank!


----------



## Der Müde Joe (17. Apr 2009)

>Wie rufe ich nun aber diese Klasse aus verschiedenen anderen Klassen auf?

out ist statisch und somit für alle Klassen das gleiche. Alle System.out.println(String) aufrufe werden nach meinen Stream umgeleitet.

>Damit hätte ich ja 10 Fenster, oder?

Ja. War auch nur ein 5 min Beispiel...(das nächste folgt so gleich)

>Erklärungen und Code Beispiele super willkommen!

habs mal ein wenig verbessert...6 min Beispiel...(sieht nicht gerade schön aus, aber tutet)


```
import java.io.PrintStream;

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


public class Use {

	public static void main(String[] args) throws Exception {
		final Foo foo = new Foo();
		// neuer Stream der Alle println aufrufe nach foo.onEvent umleitet
		PrintStream someOtherStream = new PrintStream(System.out) {

			@Override
			public void println(String s) {
				foo.onEvent(s);
			}
		};
		// System.out ist immer noch die Konsole
		System.out.println("Test Test Test");
		// System.out umlenken:
		System.setOut(someOtherStream);
		// ab hier werden alle System.out.println(String) aufrufe, meinen PS benutzen
		while (true) {
			// out ist nun meine eigenkreation
			// out.println hab ich oben überschrieben...
			// das statische feld out in der Klasse System ist nun mein PS
			// somit werden alle Sysytem.out.println(String) aufrufe umgeleitet
			System.out.println("fooo...");
			Thread.sleep(500);
		}
	}

	// Klasse mit gui
	private static class Foo {

		private JTextArea text;

		Foo() {
			// mach ein Frame und darin ein textfeld
			JFrame frame = new JFrame();
			frame.setSize(500, 500);
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			JPanel panel = new JPanel();
			text = new JTextArea();
			panel.add(text);
			frame.getContentPane().add(panel);
			frame.setVisible(true);
		}

		/**
		 * Fügt den String dem Textfeld hinzu
		 * 
		 * @param str
		 */
		void onEvent(String str) {
			text.append(str + "\n");
		}
	}
}
```


----------

