Swing vs Konsole

Status
Nicht offen für weitere Antworten.

zu1u

Mitglied
Hallo zusammen,
ich habe eine Anwendung mit einer Swing Gui zu der ich jetzt noch eine Konsole hinzugefuegt habe. Ich dachte nicht das es dabei grosse Komplikationen geben wuerde. Die Konsole laeuft logischerweise in einem eigenen Thread.

Problem ist jetzt folgendes:
Starte ich die GUI vor der Konsole, dann haengt sich die GUI unter dem Arbeiten mit ihr auf.
Starte ich Konsole vor GUI, dann kriege ich die GUI nicht angezeigt bevor ich einen Befehl auf der Konsole ausgefuehrt habe.

Ich habe gelesen, dass es Probleme macht wenn 2 Threads um eine Ressource (hier system.out) konkurrieren?! (die gui macht auch system.out.prints)

Kann mir jemand sagen wie ich das Problem moeglichst einfach in den Griff bekomme?

danke
 

Ebenius

Top Contributor
Was bedeutet denn "eine Konsole"? Ist das ein anderes Swing-Fenster oder wie muss ich das verstehen? Hängt die Konsolae an System.out, System.err und System.in? Das lässt sich für mich nicht einfach so aus Deiner Beschreibung nehmen. Kannst Du den Code für die Konsole (ggf. vereinfacht) ins Forum posten, so dass man eine bessere Idee davon bekommt?

Ebenius
 

zu1u

Mitglied
ja sorry, die haengt am System.out

der code sieht grob so aus



[highlight=Java]

public final class Console implements Runnable{

private MyApp myApp;

private enum Command{
COMMAND
};

public Console (MyApp myApp){
this.MyApp =myApp ;
}

public void run(){
try{
readInputs();
}
catch (Exception e){
System.out.println(e);
}
}

private void readInputs() throws Exception{

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

Command command = null;

while (true){
System.out.print("Console> ");

try{
command = Command.valueOf(br.readLine().);

switch (command){
case COMMAND:
System.out.println("Hallo");
default:
System.out.println("Befehl nicht gefunden");
}
}
catch (IllegalArgumentException e){
System.out.println("Befehl nicht gefunden");
}
}
}
}

[/highlight]
 

Ebenius

Top Contributor
Vor allem blockiert die Konsole den System.in. Wenn jemand anderes davon lesen will, muss der warten, bis Zeile 33 einmal zurückkehrt (also wenn jemand ENTER drückt). Und selbst dann ist nicht sichergestellt, dass der andere dran kommt; könnte auch wieder der Quelltext in der Konsole sein. Ergo: Vom System.in kann gleichzeitig nur einer lesen.

// EDIT: Das Thema hat mit Swing nix zu tun. Verschoben.

Ebenius
 

ARadauer

Top Contributor
Thread benutzen...

Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.swing.JFrame;
import javax.swing.JLabel;



public final class Console implements Runnable{
   
   public static void main(String[] args) {
      
      MyApp app = new MyApp();
      Console cons = new Console(app);
      
      Thread t = new Thread(cons);
      t.start();
   }
   
   private MyApp myApp;


   public Console (MyApp myApp){
       this.myApp =myApp ;
   }

   public void run(){
       try{
           readInputs();
       }
       catch (Exception e){
           System.out.println(e);
       }
   }

   private void readInputs() throws Exception{

       InputStreamReader isr = new InputStreamReader(System.in);
       BufferedReader br = new BufferedReader(isr);

       String command = null;
       
       while (true){
           System.out.print("Console> ");

           try{
               command = br.readLine();
               myApp.setInfo(command);
               
           }
           catch (IllegalArgumentException e){
               System.out.println("Befehl nicht gefunden");
           }
       }
   }
}

class MyApp extends JFrame{
   
   JLabel text;
   public MyApp() {
      this.setSize(200, 200);
      text = new JLabel();
      this.add(text);
      this.setVisible(true);
   }
   
   public void setInfo(String info) {
      this.text.setText(info);
      System.out.println("text gesetzt "+info);
   }
   
   
   
}

das soll mal die grundlegende funktionsweise zeigen...
 

Ebenius

Top Contributor
ARadauer, ich glaub das geht am Thema vorbei. Die Konsole wird schon über einen anderen Thread gestartet. Das Problem ist, dass hier zwei Stränge sich um den Lock auf System.in kloppen.

Ebenius
 

zu1u

Mitglied
@ARadauer: so aehnlich schaut es bei mir auch aus.. die Konsole ist bereits ein Thread

@Ebenius: Es liest aber eigentlich nur die Konsole von System.in , daher sollte das doch ok sein oder? Nur System.out nutzen sie eigentlich beide
 

Ebenius

Top Contributor
@Ebenius: Es liest aber eigentlich nur die Konsole von System.in , daher sollte das doch ok sein oder? Nur System.out nutzen sie eigentlich beide
Das würde ich an Deiner Stelle nochmal prüfen, weil die Erklärung erstklassisch zu Deiner Fehlerbeschreibung passt. :) An System.out kann ich nichts kritisches erkennen. Schreib doch mal um die readline-Zeile ...[HIGHLIGHT="Java"]synchronized (System.in) {
...
}[/HIGHLIGHT]
... Starte dann mal im Debugger (Eclipse leistet), mach Dir einen Breakpoint in die readline-Zeile, und schau, auf welchen Lock der andere Thread wartet.

Ebenius
 
Zuletzt bearbeitet:

zu1u

Mitglied
sorry ich hab den debugger bisher nicht wirklich benutzt,
wo seh ich denn auf welchen lock ein thread wartet?!

Fuer den Console.readInputs() Eintrag im 'Debug' Fenster bekomme ich bei den Variables einen Eintrag 'lock InputStreamReader' .. fuer die anderen Threads im Debug fenster bekomm ich gar keine Variables angezeigt... wie gesagt ich kenn mich da nicht so aus :oops:

allerdings denke ich jetzt das du recht hast. Ich habe z.b. ein Textfeld auf der gui, dass ja moeglicherweise auf System.in noch zugreifen will....

also davon ausgehend, wie komm ich aus der misere?!? ???:L
 

Ebenius

Top Contributor
Die GUI-Komponenten bekommen Ihre Eingaben nicht vom stdin. An einem normalen Textfeld sollte es also nicht hängen.

sorry ich hab den debugger bisher nicht wirklich benutzt, [...]
Dann wird's aber Zeit. :)

Wie man einen Breakpoint setzt weißt Du sicher oder findest es einfach heraus. Starte Deine Anwendung nicht mit "Run", sondern mit "Debug". Lass die Anwendung laufen, bis sie am Breakpoint anhält. In der Debug-Perspektive im Eclipse hast Du oben links eine View "Debug" die einen Baum aller Threads Deiner Anwendung beinhaltet. Den angehaltenen Thread kannst Du anhand optisch von den anderen unterscheiden. Nun such Dir aus dem Baum den zweiten Thread heraus; wir vermuten erstmal, dass Du den Event Dispatch Thread lahm gelegt hast. Den hältsts Du an, mit Rechtsklick "Suspend".

[...] wo seh ich denn auf welchen lock ein thread wartet?!

In den Einstellungen der Debug-View (ungefähr rechte obere Ecke, weißes Dreieck nach unten) kannst Du "Java" » "Show Monitors" auswählen. Alle Monitors (das sind die Objekte die mit dem synchronized-Schlüsselwort synchronisiert werden) werden an den angehaltenen Thread angezeigt; entweder mit "owns: ObjectBlablabla (id=0815)" (der Thread hat den Lock auf den Monitor erhalten) oder mit "waiting for: ObjectBlablabla (id=0815)" (der Thread wartet, dass ein anderer den Lock auf den Monitor freigibt).

Probier's mal aus. :)

Ebenius
 

zu1u

Mitglied
ah danke!

also ich krieg jetzt angezeigt dass der Konsole Thread: owns: BufferedInputStream (id=22)
der Thread [AWT-Shutdown]: waiting for Object (id=42)
der Thread [AWT-EventQueue-0]: waiting for: EventQueue (id = 52)

sonst habe ich keine owns/wait for gefunden

kannst du mir mit der info nochmal weiterhelfen?
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Eigenartig. Wenn Du alles richtig überprüft hast, dann ist die Vermutung mit dem Lock auf System.in falsch. Woher könnte denn sonst das Verhalten kommen, dass die restliche GUI sich erst aufbaut, wenn Du in der Konsole ENTER drückst?

Mach Dir mal einen BreakPoint auf das setVisible(true) Deines GUI-Fensters. Dann starte die Anwendung, und warte ein bisschen. Wenn Du den Breakpoint schon jetzt erreichst, verstehe ich gar nix mehr...

Und dann drück ENTER und warte, bis das setVisible(true) erreicht wird. Dann kannst Du Dir den Stack in der DebugView ansehen. Überprüf halt alle Methoden im Stack, ob sie auf irgendetwas gewartet haben.

Ebenius
 

zu1u

Mitglied
also wenn ich nur einen breakpoint beim setVisible habe, dann komme ich da auch direkt im debugen hin... ohne dass ich zuvor enter druecken muss. Am Stack kann ich an der Stelle nix auffaelliges entdecken.. nur paar 'gui starten' aufrufe..

resume ich dann an der stelle, krieg ich die gui halt noch nicht angezeigt und muss erst was in die konsole eingeben :shock:

also falls nochmal jemand hilfestellung geben kann:toll:
 

Ebenius

Top Contributor
Ich verstehe's nicht. Wenn Du mal den gesamten Quellcode hast (keine Ahnung ob Du das weggeben willst / kannst / darfst), kann ich mich ja mal reinlesen. Mehr weiß ich jetzt auch nicht.

Ebenius
 

zu1u

Mitglied
den orginal quellcode kann ich leider nicht geben.

aber probier doch mal den geposteten code von ARadauer und ersetze das JLabel durch ein JTextField

also wenn ich das bei mir hier grade mache kann ich glaube ich das reproduzieren. :lol:

Also bei mir kann ich in das Textfeld nichts reinschreiben, bis ich einmal was auf der Konsole mache

aender ich den code so dass zuerst die Konsole und dann die GUI gestartet wird dann entspricht das ziemlich genau meinem problem :oops:
[highlight=Java]

import java.io.BufferedReader;
import java.io.InputStreamReader;

public final class Console implements Runnable{

public static void main(String[] args) {

MyApp app = new MyApp();

Console cons = new Console(app);

Thread t = new Thread(cons);
t.start();

app.start();


}

private MyApp myApp;


public Console (MyApp myApp){
this.myApp =myApp ;
}

public void run(){
try{
readInputs();
}
catch (Exception e){
System.out.println(e);
}
}

private void readInputs() throws Exception{

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

String command = null;

while (true){
System.out.print("Console> ");

try{
command = br.readLine();
myApp.setInfo(command);

}
catch (IllegalArgumentException e){
System.out.println("Befehl nicht gefunden");
}
}
}
}



import javax.swing.JFrame;
import javax.swing.JTextField;

class MyApp extends JFrame{

JTextField text;
public MyApp() {
this.setSize(200, 200);
text = new JTextField();
this.add(text);

}

public void start() {
this.setVisible(true);
}

public void setInfo(String info) {
this.text.setText(info);
System.out.println("text gesetzt "+info);
}
}
[/highlight]
 

Ebenius

Top Contributor
Bei mir funktioniert der Code fehlerfrei, sowohl aus dem Eclipse als auch aus der Shell gestartet: Sun Java 6 Update 12 auf Linux.

In welcher Umgebung geht's bei Dir denn nicht?

Ebenius
 

zu1u

Mitglied
XP Java 6 Update12 ... aus Eclipse das beschr. Problem... als runnable jar nicht mehr :applaus:
das soll mir reichen, dank dir fuer die hilfe!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Anwendung starten(JAR) - Entscheidung Konsole oder Swing Allgemeine Java-Themen 5
? Swing Anwendung aus Konsole starten Allgemeine Java-Themen 7
S Kochbuch bzw. Rezepte-Datenbank app mit Swing..? Allgemeine Java-Themen 5
I Swing GUI / Webapp..... benötige ein paar Tips / Ratschläge Allgemeine Java-Themen 18
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
RalleYTN 2D-Grafik Bild ohne AWT, Swing und JavaFX rotieren Allgemeine Java-Themen 12
T Methoden Swing/Graphics/draw Allgemeine Java-Themen 6
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
N GUI Interface, swing Allgemeine Java-Themen 7
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
V Input/Output Swing Icons in Jar Archiv laden Allgemeine Java-Themen 10
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
O Swing + EJB Allgemeine Java-Themen 4
M JavaFX-Gegenstück zu Swing-Button-DoClick-Methode Allgemeine Java-Themen 5
eskimo328 Swing Client Anwendung für MAC OS (Update Routine) Allgemeine Java-Themen 6
T HTTP HttpWebRequest in Swing-Projekt nutzen Allgemeine Java-Themen 4
G Input/Output Manuelle Änderung von Wert in Swing Komponente bemerken! Allgemeine Java-Themen 2
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8
J [SWING]Elegante Java Formular Lösung? XML? Allgemeine Java-Themen 4
M Swing-Frontend abhängig von ausgewähltem Objekt Allgemeine Java-Themen 4
I Swing Welche Swing Komponente soll ich nehmen? Allgemeine Java-Themen 2
L Web-Framework und Swing Framework o.ä Allgemeine Java-Themen 15
A Swing paintcomponent komischer Fehler Allgemeine Java-Themen 6
algorismi Google maps in Java Swing Allgemeine Java-Themen 2
nrg Swing 2 Fragen zu Swing/AWT Allgemeine Java-Themen 7
T Jakarta Objekt (Excel Sheet) in Swing/SWT einbetten Allgemeine Java-Themen 3
D Organigramm mit GWT oder Swing Allgemeine Java-Themen 4
E Swing hilfe, JWindow mit eintrag in taskleiste Allgemeine Java-Themen 2
M Name der Swing Komponente Allgemeine Java-Themen 3
A awt und swing Allgemeine Java-Themen 3
MQue Swing-Componenten -> JavaBean Allgemeine Java-Themen 5
H Schrifthöhe berechnen / Swing Allgemeine Java-Themen 5
T Wo ist javax.swing.TransferHandler enthalten? Allgemeine Java-Themen 10
ARadauer Scaffolding für Swing Anwendungen Allgemeine Java-Themen 4
H Webseiten aus Swing Allgemeine Java-Themen 4
B SBCC - Swing Better Components Collection - downloadlink ? Allgemeine Java-Themen 5
G Feld Validierung in Swing Programm Allgemeine Java-Themen 6
G Swing Validierungs Framework Allgemeine Java-Themen 2
A Klappmechanismus bei Components(SWING) Allgemeine Java-Themen 8
M Swing funktioniert und funktioniert nicht Allgemeine Java-Themen 4
O Swing oder JMF Problem Allgemeine Java-Themen 11
M Swing JButton Farbe zurücksetzen Allgemeine Java-Themen 6
P RTF dynamisch machen (IText, Swing) Allgemeine Java-Themen 4
E Thread Fragen in Verbindung mit Swing Allgemeine Java-Themen 4
G java applet mit swing -> hundert prozent cpu auslastung Allgemeine Java-Themen 11
S Swing-Projekt zum Üben Allgemeine Java-Themen 5
I Servlet von einem Swing Based GUI aufrufen Allgemeine Java-Themen 5
D Spezielles Eingabefeld für Numerische Werte in Swing Allgemeine Java-Themen 2
G Swing vs. RCP Allgemeine Java-Themen 9
T substring() und Swing setText() Allgemeine Java-Themen 6
A Hibernate und Swing Allgemeine Java-Themen 2
S SWING Problem Allgemeine Java-Themen 2
S SWING UND AWT!Problem wegen Canvas! Allgemeine Java-Themen 29
clemente Swing Applikation killt kwin Prozess (unter Linux / KDE) Allgemeine Java-Themen 3
T Exception at javax.swing.plaf.basic.BasicTableUI.paintCell Allgemeine Java-Themen 3
S Swing - Problem mit Fenster-/Komponenten-Größe Allgemeine Java-Themen 3
M swing und windows registry Allgemeine Java-Themen 11
A Swing hat ein leicht verändertes Aussehen, wie findet ihrs? Allgemeine Java-Themen 28
M Was soll ich benutzen? Java2D, Java3D, Swing, AWT?? Allgemeine Java-Themen 21
U Frage zu Swing Allgemeine Java-Themen 4
B Hintergrund bei Swing Allgemeine Java-Themen 6
K swing frage (komisches swing) <-- manoman was für n threa Allgemeine Java-Themen 2
J Chatprog schließen,AWT + Swing Allgemeine Java-Themen 4
R0m1lly BinärBaum auf Konsole ausgeben Allgemeine Java-Themen 9
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
Master3000 Komisches Zeichen als Ausgabe in der Konsole Allgemeine Java-Themen 20
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
L Eclipse Konsole im exportierten Programm Allgemeine Java-Themen 2
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
G Excel Datum richtig auf der Konsole ausgeben Allgemeine Java-Themen 1
M Cmd Konsole als Java Konsole Allgemeine Java-Themen 5
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
R .txt Datei einlesen und auf der Konsole ausgeben lassen Allgemeine Java-Themen 11
A Befehle in Konsole. Allgemeine Java-Themen 12
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
Neumi5694 Swing GUI vs Konsole Allgemeine Java-Themen 4
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
B Farbiger Text in der Konsole Allgemeine Java-Themen 1
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
W Java Konsole "aufteilen" Allgemeine Java-Themen 4
G Warnung in der Konsole von Eclipse "WARNING: ..." Allgemeine Java-Themen 2
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
L Konsole gibt Smileys aus Allgemeine Java-Themen 3
T Mit Java auf die Konsole eines Process-Objekts zugreifen Allgemeine Java-Themen 10
Kaniee Konsole "mitlesen" Allgemeine Java-Themen 6
P .Jar Datein Windows Konsole zugewiesen Allgemeine Java-Themen 3
L Input/Output ProcessBuilder und Windows - Konsole verbergen? Allgemeine Java-Themen 5
T Methoden In Konsole tasten abfangen? Allgemeine Java-Themen 4
S exec( "cmd /c") aber Konsole soll offen bleiben Allgemeine Java-Themen 9
J Java-Klasse über Konsole starten Allgemeine Java-Themen 6
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
R java in der konsole nicht gefunden trotz jre,jdk,home und path Allgemeine Java-Themen 4
P Java Konsole zur Laufzeit einblenden Allgemeine Java-Themen 4
D Windows-Konsole auslesen - Zeichenkodierung Allgemeine Java-Themen 4
N GUI und zusätzlich Konsole Allgemeine Java-Themen 4
M Problem bei einer Baumausgabe auf der Konsole Allgemeine Java-Themen 3
X Konsole aktualisieren Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben