MVC: System.out.prinln in View umleiten geht nicht richtig

Status
Nicht offen für weitere Antworten.

robochris

Aktives Mitglied
Hallo Zusammen,

vielleicht kann mir jemand bei meinem etwas verzwickten Problem helfen:

1. eine Java Klasse gibt im Sekundentakt Stausmeldungen mit System.out.println aus
2. Ich möchte die Statusmeldungen nicht in der Kommandozeile sehen, sondern auf einer GUI mit verschiedenen Bedienknöpfen

Ich habe das ganze mit einem MVC Design Pattern ( Model View Controller ) versucht zu lösen.
Jetzt gibt es das folgende Problem: Im Controller rufe ich die Methode einer Java-Klasse auf, die normalerweise ihre Meldungen auf die Statuszeile mit System.out.println ausgibt. Diese schreibt die Meldungen jetzt aber in die MVC_View Klasse. Leider werden aber die Statusmeldungen im Bedienfenster erst angezeigt, wenn die Methode beendet ist. Oder anders ausgedrückt: Wenn die Methode der Klasse 10 Sekunden lang Meldungen an den View geschickt hat, werden diese erst sichtbar, wenn die Methode schon beendet ist. Ich habe versucht, an verschiedenen Stellen eine frame.repaint() einzufügen, aber es hilft nix: die Meldungen werden erst am Schluss angezeigt.

Hat jemand eine Idee?

chris
 

Marco13

Top Contributor
Wenn das, was die Meldungen verursacht, im Event-Dispatch-Thread läuft, kann eben nicht neu gezeichnet werden. Aber mangels Code... kann man nur sagen, dass man nichts genaues sagen kann...
 

robochris

Aktives Mitglied
Hallo Marco,

der Code mittlerweile etwas umfangreich, deshalb poste ich mal den wichtigsten Ausschnitt:

Im Controller werden die Event-Handler ziemlich am Anfang gestartet. Also der Controller startet den view und der view nutzt die Funktion "initialize" des Controllers um die "view" Referenz mitzuteilen.
Danach wird beim Drücken einer Taste der Actionlistener im Controller aufgerufen.
Das Problem ist jetzt, dass die Ausgaben des Objektes

hv.loadFile( model.getHexFileName());

erst angezeigt werden, wenn die "LoadFile" Methode schon durchgelaufen ist.

Hier der Code-Ausschnitt aus dem Controler:
Code:
         /**
	 * Initialisiert Model und View.
	 * @param m Mathematisches Modell
	 * @param v zum Controller gehoeriger View
	 */
	public void initialize( MVCdataModell m, MVCmainView v)
	{
	    model = m;
	    view = v;
		hv=new HexFileViewer();
		hv.initialize(m,v);
	}
         /**
	 * Verarbeiten der Bildschimreingaben.
	 */
	  public void start()
	  {
....
		  view.loadButton.addActionListener(new ActionListener()
		  {
			  public void actionPerformed(ActionEvent e)
		      {
				  System.out.println(model.getHexFileName());
				  hv.loadFile( model.getHexFileName());
				  
				  //hv.anzeigen();
		      }
		  });
...
 

Marco13

Top Contributor
Jup, da lag meine Kristallkugel wohl wieder mal richtig. Der einfachste Workaround wäre ein eigener Thread dafür
Code:
         /**
	 * Verarbeiten der Bildschimreingaben.
	 */
	  public void start()
	  {
....
		  view.loadButton.addActionListener(new ActionListener()
		  {
			  public void actionPerformed(ActionEvent e)
		      {
				  System.out.println(model.getHexFileName());
                                  Thread t = new Thread(new Runnable()
                                  {
                                      public void run()
                                      {
				          hv.loadFile( model.getHexFileName());
                                      }
                                  });
                                  t.start();
				  
				  //hv.anzeigen();
		      }
		  });
...
[/quote]

Allerdings musst du dir natürlich drüber im Klaren sein, was passieren soll, wenn ein Benutzer einen epilleptischen Anfall hat, und 2000mal hintereinander den Button klickt usw....
 

robochris

Aktives Mitglied
Hallo Marco,

danke für die Info. Es lag tatsächlich daran. Mit Deiner Methode funktioniert's. Der Text wird jetzt immer während des Methodenlaufs im View angezeigt.
Allerdings habe ich noch ein weiteres seltsames Problem: Mein Anzeigefenster ist mit einer Scrollbar versehen. Eigentlich soll die Scrollbar automatisch scrollen ( also der Text nach oben geschoben werden ) damit immer der neues Text sichtbar wird. Man sieht zwar, wie sich die JTextArea füllt, aber das Scrollen geht einfach nicht automatisch.

Code:
		frame= new JFrame(); // Hautpfenster erzeugen
		frame.setTitle(titel);
		
		messageText=new JTextArea(5,20); // Lauftext Fenster
		messageTextScroller=new JScrollPane(messageText);
		messageTextScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

Und das, obwohl ich in der draw-Methode der View das Autoscrolling eingebaut habe.

Code:
  public void draw()
	  {
		    //System.out.print( "Daten des Modells visualisieren ");
		    String[] S=model.getMessages();	    
		    messageText.append("\n"+model.getMessages()[S.length-1]);
	
		    String s=model.getHexFileName().getAbsolutePath();
		    hexFileName.setText(s);
		    s=model.getComPort();
		    comPort.setText(s);

		    JScrollBar bar=messageTextScroller.getVerticalScrollBar();  
		    int x=bar.getMaximum();
		    bar.setValue(x); 

		    System.out.println("draw");
		    frame.repaint();
	  }


Das Autoscrolling passiert erst, wenn ich einen neuen Button gedrückt habe.

Hast Du da vielleicht auch noch einen Tipp?
 

Marco13

Top Contributor
Naja, dieses Autscrolling ist auch wieder fragwürdig. Nach dem "append"
textArea.setCaretPosition(textArea.getText().length()-1);
sollte es schon tun.
 

Marco13

Top Contributor
Aber noch so als nachtrag: Swing-Components dürfen im allgemeinen nur im Event-Dispatch-Thread verändert werden - es KANN sein, dass du das jetzt (wo Teile deines Programmes in einem anderen Thread laufen) stärker berücksichtigen mußt. Das "append" ist laut Doku aber OK.
 

robochris

Aktives Mitglied
Hallo Marco,

das hat auch funktioniert. Man muss aber die -1 weglassen:

Code:
textArea.setCaretPosition(textArea.getText().length());

Die andere Method habe ich aus dem Buch "Java 6 ist auch eine Insel". Wenn ich es richtig gesehen habe, posted der Author hier auch manchmal im Forum. Vielleicht kann man das im Buch ja ändern, bzw. anmerken.

Aber noch so als nachtrag: Swing-Components dürfen im allgemeinen nur im Event-Dispatch-Thread verändert werden - es KANN sein, dass du das jetzt (wo Teile deines Programmes in einem anderen Thread laufen) stärker berücksichtigen mußt. Das "append" ist laut Doku aber OK.

Das verstehe ich leider nicht. Aber da das Programm erst mal funktioniert, werde ich es so lange ignorieren, bis ein Problem auftaucht.

Vielen Dank für Deine kompetente Hilfe,

chris
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
T JavaFX System.out.println in TextArea AWT, Swing, JavaFX & SWT 15
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
D System.out.println() gibt html-Tags mit aus AWT, Swing, JavaFX & SWT 2
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
V Swing: System-Look&Feel unter KDE AWT, Swing, JavaFX & SWT 3
R Meldungen System.out.println auf Fenster umleiten? 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 JavaFX Fehler zwischen View und Controller bei MouseEvent (MVC) AWT, Swing, JavaFX & SWT 13
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
M JavaFX - Array in View auslesen AWT, Swing, JavaFX & SWT 12
4a61766120617274697374 dynamische Tree View AWT, Swing, JavaFX & SWT 2
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
M SWT View nicht mehr sichtbar AWT, Swing, JavaFX & SWT 2
G JavaFX "Framework" zur View Ersellung AWT, Swing, JavaFX & SWT 0
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
T View AccessibleContext AWT, Swing, JavaFX & SWT 0
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
S Swing JPanel in View ersetzen AWT, Swing, JavaFX & SWT 10
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
L View aus dem MVC ist immer die GUI? AWT, Swing, JavaFX & SWT 5
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
Rudolf Swing Baut die View die Modelebene auf oder wer? AWT, Swing, JavaFX & SWT 13
G Swing MVC / View - Controller AWT, Swing, JavaFX & SWT 7
N MVC - Logik zum Verändern der View AWT, Swing, JavaFX & SWT 8
V Eclipse View Right-Click Menu hinzufügen AWT, Swing, JavaFX & SWT 2
D Drag-Action: Innerhalb meiner View? AWT, Swing, JavaFX & SWT 3
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
R Swing Designfrage - Zusammenspiel Model / View AWT, Swing, JavaFX & SWT 10
J Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen AWT, Swing, JavaFX & SWT 2
D Swing JTable Model View Problem AWT, Swing, JavaFX & SWT 6
H shell in view implementieren; menu mit keystroke unterlegen AWT, Swing, JavaFX & SWT 8
M Swing Model an View binden AWT, Swing, JavaFX & SWT 4
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
H Swing JScrollPane mit JPanel als View AWT, Swing, JavaFX & SWT 3
B Sudokuartiger View (RadiobuttonTableView) mit JFace Viewer? AWT, Swing, JavaFX & SWT 3
N FileChooser in View AWT, Swing, JavaFX & SWT 3
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
hdi Swing JTable & Filtern: Daten nicht in der View AWT, Swing, JavaFX & SWT 2
B SWT Textdatei Lesen und Anzeige in View - Zeichensatzproblem AWT, Swing, JavaFX & SWT 4
D Design - View & Controller AWT, Swing, JavaFX & SWT 2
H Eclipse View / Window Layout AWT, Swing, JavaFX & SWT 3
N RCP/SWT View durch Programm auf 2. Bildschirm verschieben AWT, Swing, JavaFX & SWT 2
B view in andere View einbinden AWT, Swing, JavaFX & SWT 5
G RCP - SWT :: Scrollbars in einer View AWT, Swing, JavaFX & SWT 10
Zed JTable view auf Selection setzen AWT, Swing, JavaFX & SWT 2
K JSpinner - Model <-> View, unterschiedliche Werte AWT, Swing, JavaFX & SWT 9
E Mehrere Views in einer View AWT, Swing, JavaFX & SWT 3
TRunKX Ereignissweitergabe von Jlist.getSelected() aus der View AWT, Swing, JavaFX & SWT 7
P Verbindung View und Controller AWT, Swing, JavaFX & SWT 3
D Scrollbalken in einem View AWT, Swing, JavaFX & SWT 2
I Shell aus einer Plugin-View öffnen . AWT, Swing, JavaFX & SWT 4
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
S MVC - Neues Frame, neue View, neuer Controller? AWT, Swing, JavaFX & SWT 3
C Model View Controller - Beispielimplementation AWT, Swing, JavaFX & SWT 5
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
M auch JScrollPane aber mit Zoomen, wie wird der View gesetzt AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben