Inputstream aus Konsole in JTextArea

Benji0815

Aktives Mitglied
Ich werwende den ganz unten stehenden Code um Consolenmeldungen in einer JTextarea in meiner GUI anzuzeigen. Wenn ich in meinem Code eine Benutzereingabe verwende ... ->

Java:
...
Scanner bsc = new Scanner( System.in );
System.out.println("Eingabe: ");
String gatedog = bsc.nextLine();
if(gatedog.equals("ja")){
        retVal.add(u);
}
...

<- ... möchte ich, dass ich in der Textarea nicht nur "Eingabe:" sehe, sondern auch eine Eingabe machen kann.

Bisher muss ich die Eingabe noch über die Console in Eclipse machen, ich würde die Antwort aber lieber über die JTextarea eingeben.

Kann mir jemand weiterhelfen?


Java:
 System.setOut(new PrintStream(new OutputStream() {

	        @Override
	        public void write(byte[] b, int off, int len) throws IOException {
	          ta.append(new String(b, off, len));//ta ist eine JTextArea
	          autoScroll();
	          try {
	      		f.write(new String(b, off, len));
	      	} catch (IOException e) {
	      		e.printStackTrace();
	      	}  	
	        }

	        @Override
	        public void write(byte[] b) throws IOException {
	          this.write(b, 0, b.length);
	        }

	        @Override
	        public void write(int b) throws IOException {
	          this.write(new byte[] { (byte)b });
	        }

	      }));
 
Das hilft mir schon mal weiter! DANKE!

Ich hatte mir irgendwie gedacht, dass es vielleicht auch die Möglichkeit gibt soetwas ähnliches zu machen wie ich mit dem System.setOut(...)

Das es vielleicht auch ein System.setIn(...) gibt. Wenn ja müsste ich dann dort auch die write methode überschreiben?


Gibt es vielleicht auch die Möglichkeit alles was ich in der Eclipse Console kann in eine JTextArea umzuleiten. System.out, System.in, System.err....
 
Du kannst einen eigenen [c]PrintStream[/c] schreiben, welcher in den jeweiligen Methoden das Textfeld updated. Schöner wärs natürlich mit einer [c]List[/c] von Textfeldern, welche sich selber registrieren können. Oder sogar einem/mehreren Listener 😀 ?
 
Ich hab sowas ähnliches Mal in einem JUnit Test gemacht, um gewisse Konsolenausgaben zu testen:
Java:
private PrintStream stdout;
private final List<String> returnLines = new ArrayList<String>();

@Override
protected void setUp() throws Exception {
    super.setUp();
    stdout = System.out;
    System.setOut(new PrintStream(System.out) {
        @Override
        public void println(String x) {
            returnLines.add(x);
        }
    });
}

@Override
protected void tearDown() throws Exception {
    super.tearDown();
    System.setOut(stdout);
}
So konnte man im Test einfach die Methoden aufrufen, welche gewissen Output machen und danach [c]returnLines[/c] überprüfen.

Edit: natürlich habe ich mir nicht die Mühe gemacht, alle Methoden zu überschreiben, da ich mir bewusst war, dass sowieso nur [c]println(String)[/c] aufgerufen wird.
 
Zuletzt bearbeitet:
Wenn noch jemand einen weiteren Tip im Bezug zu meinem Problem mit dem InputStream hat würde mich das interessieren. Ansonsten nochmal vielen Dank!
 
Also ein [c]System.setIn()[/c] wird es in absehbarer Zeit wohl kaum geben, da [c]System.in[/c] sozusagen mit der Tastatur fest verdrahtet ist. Wenn man seine Eingaben zeichenweise in einer Konsole darstellen will, kommt man nicht drum rum, sich seine eigene "Konsole" zu entwickeln, die auf KeyEvents reagiert. Mit anderen Worten ein eigenes Set von Input-, Output- und ggf. ErrorStream. Wenn man über eine solche "Konsole" native Kommandos (z.B. [c]format c:[/c]) ausführen will, müssen diese allerdings an [c]runtime.exec()[/c] übergeben werden.
 
Vielleicht denke ich auch viel zu kompliziert.

Was ich eigentlich möchte ist irgendeine Möglichkeit von der GUI aus mit ja oder nein (beliebiger String) auf den Scanner zu antworten. Jenachdem wird dann ein Wert in eine Liste eingetragen oder nicht.

Das ganze ist ein Element in einem Programm das Zeichenketten mit Dateipfaden einliest, es findet eine Vorfilterung statt und bei allen Zeichenketten die übrig bleiben soll der Benutzer in jedem Fall gefragt werden, ob das jeweilige Dokument aufgenommen werden soll oder nicht. Ich habe den Scanner verwendet um den Programmfluss zu unterbrechen und mit ja / nein reagieren zu können.

Es muss nicht einmal ja oder nein geschrieben werden. Es könnte z.B. auch zwei Button geben, die dem gatedog sobald eine Benutzereingabe erwartet wird einen Wert übergeben, der eine ja der andere z.B. nein.

Was mir grad eingefallen ist, vielleicht reicht auch eine Meldung aus, die aufpoppt sobald eine Nutzereingabe erforderlich ist und über diese kann ja oder nein eingegeben werden. Sowas müsste doch ohne weiteres möglich sein, oder?

Ich denke diese Beschreibung kommt meinem eigentlichen Problem näher. Über Ideen und Anregungen freue ich mich!

Java:
...
Scanner bsc = new Scanner( System.in );
System.out.println("Eingabe: ");
String gatedog = bsc.nextLine();
if(gatedog.equals("ja")){
        retVal.add(u);
}
...
 
Dann würde ich sofort zu [c]runtime.exec()[/c] raten. Also das Kommando (möglicherweise der Befehl "dir"?) damit ausführen, den InputStream des Prozesses holen, an einen beliebigen OutputStream weiterleiten und während dieser Weiterleitung auf Ereignisse prüfen, die einer Interaktion bedürfen. Interaktionen können dann per ChoiceRequester (modaler Dialog) getätigt werden.
 
Die Zeichenketten mit Dateipfaden liegen nicht lokal. Das Programm ist ein Spider mit dem ich meine Webseite auslesen möchte. Um mich korrekt auszudrücken sollte ich statt dateipfaden wohl lieber URLs sagen

Mit der Vorfilterung kann ich URLs mit einem bestimmten Substring auswählen, nur wenn diese enthalten ist wird die URL heruntergeladen. Alle anderen URLs werden noch mehrmals nach verschiedenen Kriterien gefiltert.

Am Ende bleiben einige URLs übrig bei dennen ich von Fall zu Fall entscheiden möchte, ob ich Sie runterladen möchte oder nicht. Hierfür brauche ich einen Entscheidungsmechanismus der den Programmfluss stoppt und mir eine Interaktionsmöglichkeit gibt "runterladen" oder "nicht runterladen"

Und diese Interaktion möchte ich über meine GUI bedienen können.

Wie gesagt mein Idee wäre eine Meldung die aufpoppt. Vielleicht mit zwei Buttons ja / nein. Das müsste doch gehen oder, dass ich so mit dem Scanner interagieren kann?

Oder eine Meldung in einem Textfeld direkt in der GUI ohne Meldungsfenster die mich darauf aufmerksam macht das jetzt eine Eingabe von mir erwartet wird und dann zwei Buttons zum Antworten mit ja/nein. Dazu müsste ich natürlich wissen wie ich das Textfeld mit der Meldung aktualisiern kann.

Freue mich auf weitere Anregungen!
 
Zuletzt bearbeitet:
Hab es ausprobiert, die Variante mit der Meldung die aufpoppt gefällt mit ganz gut. Hab es auch bereits implementiert. War ganz einfach.

Das finde ich das tolle an Foren, dass man gezwungen ist das was man sucht in Worte zu fassen. Beim formulieren und nochmal durchlesen meiner Beiträge komme ich oft selbst auf die Lösung.

Die Anregungen von anderen sind natürlich auch nicht zu vernachlässigen, die sehen das Problem meist aus einem anderen Blickwinckel und haben oft mehr Erfahrung und das hilft schon weiter.

Also nochmal vielen Dank!
 
...Ok... dann eben URLs. Das ändert aber nichts daran, dass die Abfrage per modaler Dialog (vor allem in einer GUI) viel eleganter ist, als dass man versucht, die Konsole (auch mittels Scanner) dazu zu "missbrauchen" um daran zu scheitern. Ein modaler Dialog lässt sich ja auch um einiges angenehmer instanzieren:
Java:
final JDialog modalDialog = new JDialog(guiwindow, "Interaktion erforderlich", modalityMode) {
  {
    // Buttons und ActionListener hinzufügen
  }
};
modalDialog.setVisible(true);
Ein Dialog erweitert letztendlich [c]java.awt.Window[/c] wodurch es zu einem [c]Container[/c] wird. Diesem kann man zwei Buttons (Ok und Cancel) adden, die ein boolean (Klassenvariable) beeinflussen, welches letztendlich die Entscheidung darstellt. Ich könnte mir durchaus vorstellen, das man da noch nicht mal selbst was Entwickeln muss, also das es bereits etwas Fertiges gibt. Sicher bin ich da jedoch nicht.
@Edit: Hab' ich wirlich knapp 10 Min. für diese Antwort gebraucht? OMG 🙂
 
Zuletzt bearbeitet von einem Moderator:
Das ist doch genau das was ich jetzt gemacht habe!

Java:
int response;

                	response = JOptionPane.showConfirmDialog(null, u + " herunterladen?");
                	System.out.println(response);
        			//String gatedog = bsc.nextLine();
        			if(response == 0){
        				retVal.add(u);
        				System.out.println("Done!");
        			}
 

Neue Themen


Zurück
Oben