JavaFX System.out.println in TextArea

Tooltime

Mitglied
In einem Spiel, welches zur Zeit auf der Konsole läuft, möchte ich alle System.out.println in die GUI umleiten. Ich habe dafür eine TextArea erstellt und eine Methode "void print text (String text)" sowie einen PrintStream erstellt.

Hier der Quelltext für die GUI:

Java:
import java.io.PrintStream;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class Gui extends Application {

    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 800, 800);

        // Buttons:
        Button n = new Button("Norden");
        n.setLayoutX(600);
        n.setLayoutY(450); // Position des Buttons
        root.getChildren().add(n);
        Button o = new Button("Osten");
        o.setLayoutX(660);
        o.setLayoutY(500);
        root.getChildren().add(o);
        Button s = new Button("Süden");
        s.setLayoutX(600);
        s.setLayoutY(550);
        root.getChildren().add(s);
        Button w = new Button("Westen");
        w.setLayoutX(540);
        w.setLayoutY(500);
        root.getChildren().add(w);
        Label labelText = new Label("Code hier eingeben"); // ein Label wurde
                                                            // erzeugt für den
                                                            // TextField
        labelText.setLayoutX(10);
        labelText.setLayoutY(475);
        root.getChildren().add(labelText); // setze die Position der label ein
        final TextArea textOut = new TextArea();
        textOut.setPrefSize(300, 100);
        textOut.setLayoutX(50);
        textOut.setLayoutY(500);
        root.getChildren().add(textOut);

        Image img1 = new Image(Game.class.getResource("Schulflur 1.jpg")
                .toExternalForm()); // erzeugt ein neues Bild in gleiches
                                    // verzeichnis wie die Klasse Game
        Image img2 = new Image(Game.class.getResource("Spielplan.png")
                .toExternalForm());
        ImageView imgV1 = new ImageView(img1); // Node für das dimensionierung
                                                // des Bildes würde erzeugt
        ImageView imgV2 = new ImageView(img2);
        imgV1.setLayoutX(0);
        imgV1.setLayoutY(0);
        imgV1.setFitWidth(400);
        imgV1.setFitHeight(400); // setze ein die Position des Bildes und seine
                                    // Höhe und Breite
        imgV2.setLayoutX(425);
        imgV2.setLayoutY(0);
        imgV2.setFitWidth(375);
        imgV2.setFitHeight(400);
        root.getChildren().add(imgV1); // Bild auf des Parent Group hinzufügen
                                        // um das Bild zu zeigen
        root.getChildren().add(imgV2);
     
     
        PrintStream stream = new PrintStream(System.out) {
         
            @Override
            public void print(String text) {
                textOut.setText(text + "\n"); 
                }
        };
        System.setOut(stream);
     
     


        stage.setTitle("World of Zuul"); // Fenstertitel
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);

        Game game = new Game();
        game.play();
     
     

    }

Bisher hab ich im Internet nur Beispiele für "JTextArea" gefunden. Dafür müsste ich aber die gesamte GUI umschreiben + hab ich noch nie mit "JFrame" gearbeitet.

Meine Frage: Ist der Ansatz für eine Ausgabe in die GUI soweit richtig?
Was muss ich jetzt noch machen, damit in allen anderen Klasse die syous in die TextArea angezeigt werden?
 
Zuletzt bearbeitet von einem Moderator:

Jardcore

Top Contributor
Dein Ansatz ist richtig, folgendes Programm benutzt quasi deine Methode und es funktioniert, vielleicht liegt der Fehler an anderer Stelle.

Java:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MainApp extends Application {

    private TextArea textArea = new TextArea();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        initStage(stage);
    
        System.out.println("Hello World in Console");
        PrintToTextArea.create(textArea);
        System.out.println("Hello World in TextArea");
    }

    public void initStage(Stage stage) {
        HBox hbox = new HBox();
        hbox.getChildren().add(textArea);
        Scene scene = new Scene(hbox);
        stage.setScene(scene);
        stage.show();
    }
}

Java:
import java.io.PrintStream;

import javafx.scene.control.TextArea;

public abstract class PrintToTextArea {

    public static void create(TextArea textarea) {
        PrintStream stream = new PrintStream(System.out) {
            @Override
            public void print(String text) {
                textarea.setText(text + "\n");
            }
        };
        System.setOut(stream);
    }
}

P.S: Dein Ansatz gefällt mir, nicht alles völlig neu schreiben zu müssen, sondern zu versuchen das Alte irgendwie zu nutzten :)
 
Zuletzt bearbeitet:

Tooltime

Mitglied
Danke für deine Antwort.
Hab gestern und heute getüftelt. Es hilft mir aber nichts. Sobald ich jetzt eine dritte Klasse hinzuziehe und die Methode aufrufen will, wird immer eine textArea verlangt.

Da ich aber nicht aufgeben will, hab ich mir noch was überlegt, und zwar diesmal ohne Stream:

Java:
public abstract class PrintToTextArea extends MainApp {
    public void print(String text) {
        textOut.setText(text + "\n");
    }
}

Java:
public class Test {

    private PrintToTextArea printToTextArea;

    public void Welcome() {
        System.out.println("Hallo Console");
        printToTextArea.print("Hallo GUI");
    }
}

Java:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class MainApp extends Application {
    public TextArea textOut = new TextArea();

    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 800, 800);

        textOut.setPrefSize(300, 100);
        textOut.setLayoutX(50);
        textOut.setLayoutY(500);
        root.getChildren().add(textOut);
        stage.setTitle("World of Zuul"); // Fenstertitel
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);   
        Test test = new Test();
        test.Welcome();
    }
}

Bei dem Aufruf von der Methode kommt eine Fehlermeldung, mit der ich nichts anfangen kann:

Code:
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.NullPointerException
    at Test.Welcome(Test.java:9)
    at MainApp.main(MainApp.java:32)
    ... 11 more
Exception running application MainApp

Wenn diese Ausgabe funktioniert, bin ich einen großen Schritt weiter
 
Zuletzt bearbeitet von einem Moderator:

VfL_Freak

Top Contributor
Moin,

habe es jetzt nur schnell überfliegen können, aber PrintToTextArea ist eine eigene KLASSE, also solltest davon auch ein Objekt erzeugen und nicht nur eine Variable !!

Java:
// also statt
private PrintToTextArea printToTextArea;

// sowas
PrintToTextArea printToTextArea = new PrintToTextArea();

Gruß Klaus
 

Jardcore

Top Contributor
Hab gestern und heute getüftelt. Es hilft mir aber nichts. Sobald ich jetzt eine dritte Klasse hinzuziehe und die Methode aufrufen will, wird immer eine textArea verlangt.
Also ich hatte das eigentlich auch getestet, und meine Meldungen wurden alle nach dem static Aufruf der PrintToTextArea Klasse ausschließlich in das hinterlegte TextArea gepostet. Ich schau mir das vielleicht später nochmal an :) Bis dahin, frohes schaffen ^^
 

Tooltime

Mitglied
:( Klappt bis jetzt immer noch nicht. Ich habe mal ein neues Objekt erzeugt, also

Code:
PrintToTextArea printToTextArea = new PrintToTextArea();

Jetzt kommt zwar keine Fehlermeldung mehr, aber die TextArea ist immer noch leer :(

Aber warum macht der Aufruf
Code:
printToTextArea.print("Hallo GUI");
einfach nichts?
 

Jardcore

Top Contributor
Wieso extended dein PrintToTextArea eigentlich von MainApp?
Guck dir nochmal mein Beispiel an, was dort abstract und was static und was wo wie initialisiert wird.
Dann müsstest du feststellen das du nur eine TextArea brauchst und auch niemals dein print Aufruf.

Wieso deine Zeile nicht funktioniert muss man anhand des kompletten Codes analysieren.
 

Tooltime

Mitglied
Ich habs jetzt mit deinem Code nochmal probiert.
Also, neben deinen beiden Klassen nehme ich jetzt eine dritte Klasse hinzu.
In dieser dritten Klasse definiere ich irgendeine Methode.
In dieser Methode erfolgt ein Sysou. Jetzt möchte ich, dass diese Ausgabe in die Area erfolgen soll. Also rufe ich die definierte Methode auf
Code:
PrintToTextArea.create();
Jetzt wird nur noch verlangt, dass als Argument eine TextArea eingesetzt werden soll. Also nehm ich ja die TextArea, welche in der Klasse MainApp erstellt wurde. Auf die erstellte TextArea erhalte ich aber kein Zugriff. Objektaufruf funktioniert nicht. Ich kann konnte nur auf die Area zugreifen, sobald ich meine dritte erstellte Klasse von der Klasse MainApp erben lasse. Mein Aufruf erscheint aber nicht auf der Area.

Da erben für mein Projekt keine sinnvolle Lösung ist, bleibt ja nur noch
Code:
PrintToTextArea.create(new TextArea("Hallo GUI"))
Hier ergeben sich wiederum zwei Probleme:
1. Ich hätte am Ende dutzende von TextAreas.
2. Ich müsste diese TextArea wieder in die GUI einfügen...selbst dass klappte nicht mehr.

Der Sinn von meiner Idee war, dass ich durch diese Methode alle Sysous nur umschreiben muss, also statt "System.out.println()" nur "printToTextArea.print".

Ich kann mir vorstellen, dass ich bei den jetzigen Überlegungen einiges falsch verstanden habe.
Sagt mir bitte, wo der Denkfehler ist.
 

Jardcore

Top Contributor
Der statische Aufruf PrintToTextArea.create (...); muss nur ein einziges mal erfolgen. Ganz am Anfang deines Programm, ab da wird dann dein Standardoutput in das übergebene TextArea umgeleitet. :)

Vllt sollte man die Klasse umnennen in StandartOutputToTextArea ;)
 

Tooltime

Mitglied
Also im Prinzip, alle Methodenaufrufe unter PrintToTextArea.create(...) setzen (hast du aber bestimmt nicht gemeint :cool:)? Ok, dabei wird mein Text jetzt übergeben, jdeoch die zuvor definierten Methoden überschrieben, sprich, wenn ich zwei Methoden habe, wird nur noch der Aufruf von der zweiten Methode angezeigt.
Edit: Statt textarea.setText() muss textarea.appendText() folgen
 

Tooltime

Mitglied
Schön, jetzt kalppt es wenigstens bei dem kleinen Programm.
Bei meinem Hauptprogramm öffnet sich jetzt das GUI Fenster mit einem leeren Inhalt. Am Fensterrand steht "Keine Rückmeldung". Ich bekomm jetzt Schnappatmung. :confused:
Danke für eure Hilfe, hatte ja wenigstens einen Teilerfolg. :)
 

Tooltime

Mitglied
Habe eine Lösung gefunden und wollte die einfach mal mitteilen:

Java:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class MainApp extends Application {
    public TextArea textOut = new TextArea();

    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 800, 800);

        textOut.setPrefSize(300, 100);
        textOut.setLayoutX(50);
        textOut.setLayoutY(500);
        root.getChildren().add(textOut);
        stage.setTitle("World of Zuul"); // Fenstertitel
        stage.setScene(scene);
        Test test = new Test(this);
        test.welcome();
        stage.show();
    }
    public void print(String text){
        textOut.setText(text);
    }

    public static void main(String[] args) {
        launch(args); 
    }
}


Java:
public class Test {
private MainApp ma;

public Test(MainApp ma){
    this.ma=ma;
}

    public void welcome() {
        System.out.println("Hallo Console");
        ma.print("Hallo GUI");
    }
}
 

Tooltime

Mitglied
Doch, genau so wollte ich es.
Das Hauptprogramm stürzt zwar immer noch ab. Dies hängt aber wahrscheinlich damit zusammen, dass es dort einen InputStream für Eingaben gibt. Ich muss also noch irgendwie die Eingaben, welche in der Konsole getätigt wurden, in eine andere TextArea umleiten.
Jetzt muss ich mich ersteinmal in der API einlesen, was ein BuffReader ist und was ein StringTonkenizer so macht :).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D System.out.println() gibt html-Tags mit aus AWT, Swing, JavaFX & SWT 2
R Meldungen System.out.println auf Fenster umleiten? AWT, Swing, JavaFX & SWT 3
B JavaFx TreeView mit file system AWT, Swing, JavaFX & SWT 1
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
I JFileChooser mit System L&F bei anderem L&F der eigtl. Anwendung AWT, Swing, JavaFX & SWT 0
L Komplettes Löschen SWT vom System AWT, Swing, JavaFX & SWT 6
S Swing JRE System Libary AWT, Swing, JavaFX & SWT 3
A Wie baue ich das Bus-System in ein Java Projekt ein? AWT, Swing, JavaFX & SWT 5
M Benutzer-Dialog ohne System.in/out AWT, Swing, JavaFX & SWT 2
Luk10 Fragen zum Koordinaten System AWT, Swing, JavaFX & SWT 3
GUI-Programmer Translucent JFrame mit System-LookAndFeel AWT, Swing, JavaFX & SWT 4
H Anwendung schließen ohne System.exit AWT, Swing, JavaFX & SWT 5
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
S System.out in JTextArea AWT, Swing, JavaFX & SWT 4
J Swing Doppelklickzeit vom System AWT, Swing, JavaFX & SWT 17
A Swing Text von System.out.printIn in eine TextArea übergen AWT, Swing, JavaFX & SWT 12
R Wie in GUI System.out's darstellen AWT, Swing, JavaFX & SWT 8
T Dynamic JTree: File System Problem AWT, Swing, JavaFX & SWT 2
P System.exit(0); ausführen, wenn letztes Fenster geschlossen AWT, Swing, JavaFX & SWT 10
R MVC: System.out.prinln in View umleiten geht nicht richtig AWT, Swing, JavaFX & SWT 7
V Swing: System-Look&Feel unter KDE AWT, Swing, JavaFX & SWT 3
M Image in System Clipboard mit java 1.3 AWT, Swing, JavaFX & SWT 2
M Problem mit System.setOut()/setErr() und MultiThreading AWT, Swing, JavaFX & SWT 11
S K.O.-System zeichnen AWT, Swing, JavaFX & SWT 3
V System Look and Feel, FileChooser, Optionen einer jar-Datei AWT, Swing, JavaFX & SWT 10
D Auf System-Icons wie die aus JOptionPane zugreifen? AWT, Swing, JavaFX & SWT 6
S Defaulticon für einen Datentyp vom System bekommen? AWT, Swing, JavaFX & SWT 3
S LaF - switcht erst während des Runs auf System.LaF AWT, Swing, JavaFX & SWT 2
S Dispose() anstatt system.exit(0) AWT, Swing, JavaFX & SWT 8
G standard system icons AWT, Swing, JavaFX & SWT 1
S Dringend: Choice -> PrintLn? AWT, Swing, JavaFX & SWT 11
L TextArea Zeichenabstand gleich machen AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
D Hohe Prozessorauslastung bei Ausgabe auf TextArea AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
Hatsi09 TextArea formattieren AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
E Eingabe von Zahlen in TextArea AWT, Swing, JavaFX & SWT 2
K JavaFX: TextArea updated nicht AWT, Swing, JavaFX & SWT 7
M JavaFX TextArea disabled - ScrollBar enabled AWT, Swing, JavaFX & SWT 3
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
MrSnake JavaFX TextArea updated nicht AWT, Swing, JavaFX & SWT 22
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7
B Java FX FXML Textarea SceneBuilder als XML Editor AWT, Swing, JavaFX & SWT 1
F JavaFX JavaFX HTMLEditor-Eingabe in Textarea als HTML anzeigen AWT, Swing, JavaFX & SWT 2
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
E Swing Error icon in der TextArea AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
thobren JavaFX Inhalte aus dynamischen vbox mit TextArea auslesen AWT, Swing, JavaFX & SWT 9
thobren Swing Im JPanel wird nur TextArea gelöscht AWT, Swing, JavaFX & SWT 13
J JavaFX TextArea dynamisch Icon im Background anzeigen AWT, Swing, JavaFX & SWT 2
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
M JavaFX TextArea richtig formatieren AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
S Die Rücktaste und Entfernen in einer Textarea blockieren AWT, Swing, JavaFX & SWT 3
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
E TextArea - Maximale Zeichenanzahl AWT, Swing, JavaFX & SWT 2
N Swing teilstring in textarea fett machen AWT, Swing, JavaFX & SWT 13
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7
W Vergleich zweier Strings und schreiben in Textarea AWT, Swing, JavaFX & SWT 12
R AWT TextArea schreibunfähig machen AWT, Swing, JavaFX & SWT 5
J Werkzeugleiste für TextArea? AWT, Swing, JavaFX & SWT 10
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
S Textarea und Enter AWT, Swing, JavaFX & SWT 5
El_Lobo Swing Swing TextArea und JTextField werden nicht aktualisiert AWT, Swing, JavaFX & SWT 2
R Textarea zeigt Text nicht an AWT, Swing, JavaFX & SWT 5
H TextArea zeigt kein Text an AWT, Swing, JavaFX & SWT 6
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
C TextArea Ausgabe immer ganz oben AWT, Swing, JavaFX & SWT 3
C Konsolenausgabe in TextArea ausgeben AWT, Swing, JavaFX & SWT 8
P Swing Methodenaufruf beeinflusst TextArea nicht. AWT, Swing, JavaFX & SWT 6
S TextArea ausgabe ohne JFrame zu implementieren AWT, Swing, JavaFX & SWT 2
M Swing Eine andere Klasse über Button starten und in TextArea ausgeben AWT, Swing, JavaFX & SWT 13
M Inhalt aus TextArea verarbeiten AWT, Swing, JavaFX & SWT 4
S Sobald ich TextArea mit Text fülle alles weg? AWT, Swing, JavaFX & SWT 5
P TextArea Größenänderung AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
H anderes font in textarea AWT, Swing, JavaFX & SWT 2
E Datei in TextArea anzeigen AWT, Swing, JavaFX & SWT 12
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
H AWT TextArea, TextListener AWT, Swing, JavaFX & SWT 5
D Swing [BoxLayout] Nur TextArea und nicht TextField vergroessen AWT, Swing, JavaFX & SWT 2
W JTextArea/TextArea kriegt keinen Fokus AWT, Swing, JavaFX & SWT 6
A Strings an Textarea anderer Klasse append(en) AWT, Swing, JavaFX & SWT 12
U Problem mit dem TextArea.appen()- Befehl AWT, Swing, JavaFX & SWT 2
G Textarea zeigt Text erst am Schluss an AWT, Swing, JavaFX & SWT 2
W JTextArea vs TextArea AWT, Swing, JavaFX & SWT 3
K TextArea auf Scrollpane AWT, Swing, JavaFX & SWT 3
A Dateien in TextArea ausgeben AWT, Swing, JavaFX & SWT 6
G Textarea soll automatisch mitrollen AWT, Swing, JavaFX & SWT 2
G Feste Größe einer TextArea AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben