Portal > Foren > Java > Desktop-Applikationen und Grafik > Swing-GUI reagiert nicht
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 18.07.2005, 14:06 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard Swing-GUI reagiert nicht

Hallo!
Mein Programm verarbeitet eine ca. 8MB-große XML-Datei. Während der Verarbeitung sollten einige Statusmeldungen angezeigt werden (z.B. "Ich habe einen Tag so-und-so gefunden..."). Dafür habe ich eine JEditorPane gebastelt, in welche die entsprechenden Meldungen vom XML-Parser (ich verwende SAX) geschrieben werden.
The problem is that... da die Datei ziemlich groß ist, "hängt" meine GUI während der Verarbeitung und die JEditorPane bleibt leer. Erst nachdem alles gelaufen ist, kann ich alle Meldungen sehen.
Wie kann ich also eine GUI-Komponente während der Verarbeitungsroutine "wiederbeleben"? :rolleyes:
eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.07.2005, 15:08 Nach oben    #2
Soulfly
Gast
 
Beiträge: n/a
Standard

Hast vielleicht alles in einem Thread am laufen. Versuch mal das auslesen in einen anderen thread zu packen.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.07.2005, 15:21 Nach oben    #3
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard

Zitat:
Zitat von Soulfly
Hast vielleicht alles in einem Thread am laufen. Versuch mal das auslesen in einen anderen thread zu packen.
Hab eben ausprobiert, geht trotzdem nicht.
eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.07.2005, 17:51 Nach oben    #4
Soulfly
Gast
 
Beiträge: n/a
Standard

Zeig mal ein bißchen Code. Weil jetzt weiß ich auf anhieb nicht, was du da machst!
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.07.2005, 01:55 Nach oben    #5
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 432
Standard

Hast Du mal ein repaint() versucht?
__________________
Denk mal darüber nach...

Lars

ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen.
www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de
Sym ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.07.2005, 12:10 Nach oben    #6
Erfahrener Benutzer
 
Registriert seit: 02.02.2005
Beiträge: 559
Standard

Wie wärs mit nem extra Thread? Und evtl. noch InvokeLater aus den SwingUtilities?

[edit] ok, hab grad gesehen, dass der Vorschlag scho da war. Dann test ma InvokeLater
Gottzilla ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.07.2005, 14:35 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard

Sym, repaint() hat leider nix gebracht.

Soulfly, Hobbit_im_Blutrausch - hier mein Versuch mit einem extra Thread.
Vielleicht hab ich da was falsch gebaut?! :confused:

PHP-Code:
// SAX-Parser: Aufruf bei jedem gefundenen Tag
public void startElement(String uriString sName,
                         
String qNameAttributes atts)
  {
        
= new Thread(this);
        
t.run()
  }

//...

// stateWindow ist meine JEditorPane, die mit SingletonPattern realisiert ist
public void run()
  {
    
stateWindow.addMessage("In progress...");
    
stateWindow.repaint();
  }

//...

// und zwar:
  
public void addMessage(String msg)
  {
    if (
this.msgBox != null)
    {
      
Document doc msgBox.getDocument();
      try
      {
        
doc.insertString(doc.getLength(), msgnull);
      }
      catch (
BadLocationException ex)
      {
        throw new 
RuntimeException(ex.getMessage());
      }
    }
    else
    {
      throw new 
NullPointerException("Status-Fenster existiert nicht!");
    }
  } 
Hoffentlich wird der Code reichen, oder soll ich die ganze Klasse zeigen?

Vielen Dank für eure Hilfsbereitschaft!!!
eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.07.2005, 15:49 Nach oben    #8
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

Also vielleicht versteh ich den Code hier falsch oder aber ich hab den Vorschlag mit dem Thread falsch verstanden, aber ich hab das eigentlich so verstanden, dass du das Auslesen des Dokuments in einen Thread packen sollst, und die Meldungen in einen anderen.
Oder liege ich da komplett falsch?
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.07.2005, 09:28 Nach oben    #9
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard

Hot-Thunder, hm... Kann sein, dass ich das falsch verstanden habe. Aber... da die Meldungen vom SAX-Parser kommen, kann ich nur in ihm einen neuen Thread starten, der meine Meldungen anzeigen wird. Oder liege ich da völlig falsch? Was wäre dein Vorschlag?
Ich habe mich nämlich nicht so viel mit Threads beschäftigt...
eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.07.2005, 09:34 Nach oben    #10
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.161
Standard

Du solltest den Aufruf des Parsers in einen neuen Thread lagern, d.h. so, dass das Parsen der XML-Datei in einem eigenen Thread stattfindet.
Nicht der kleine Krimskrams da von wegen startElement, sondern der Aufruf des Parsers an sich.
Dafür musst du dann aber die addMessage so verändern, dass sie im Even-Dispatch-Thread ausgeführt wird. Das geht am einfachsten, in dem du den Code als Runnable realisierst und dann der SwingUtilities.invokeLater() übergibst.

Ansonsten müsste dazu aber auch noch was im Java-Tutorial stehen, soweit ich weiß.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.07.2005, 09:23 Nach oben    #11
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard

TheDragonMaster, vielen Dank, es hat geklappt! War nicht nötig den Parser in einem eigenen Thread zu starten, aber SwingUtilities.invokeLater() - das war das Zauberwort!

Hab jetzt allerdings Probleme mit der GUI-Ausgabe. Ich wollte nämlich eine JEditorPane für die Ausgabe benutzen, aber während der Oberflächenaktualisierung kriege ich einen Error und zwar:
javax.swing.text.StateInvariantError: infinite loop in formatting

Wenn ich aber statt JEditorPane einen einfachen JLabel.setText(myNewMessage) benutze, dann ist die Welt wieder in Ordnung. Der Google meinte, solch ein Fehler kommt nicht selten vor. Ich bin mit ihm konfrontiert, erst wenn ich große Dateien verarbeite. Ist die Datenmenge gering, geht es auch mit JEditorPane unproblematisch.
Wenn jemand da eine Idee hat - wäre ich sehr dankbar! Sonst muss ich mich mit JLabel beglücken.

Nochmal vielen Dank an alle!!!
eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.07.2005, 14:51 Nach oben    #12
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard

Ich bin's wieder

Leute, ich hab jetzt ein anderes Problem.
Das Ganze funktioniert nur, wenn ich nur ein Gui-Objekt (also ein JFrame habe). Ich will aber ein Hauptfenster haben (mit einem "OK"-Button), wobei beim Click auf "OK" ein zweiter Frame geöffnet wird, in den meine Statusmeldungen geschrieben werden.

Wenn ich aber auf "OK" klicke, bleibt mein zweite (Output-)Frame leer, bis alles gelaufen ist. Erst danach sehe ich den Output (also dasselbe Problem, das ich gleich am Anfang geschildert habe).

Vermeide ich das Hauptfenster und starte meinen Parser direkt (d.h. ohne auf "OK" zu klicken), wird mein Output schon während des Parsens ausgegeben. Genau das ist es, was ich haben will. Warum geht das nicht mit dem "OK"-Button? :confused:

Hier bisschen Code zur Veranschaulichung:
PHP-Code:
package xml2csv.test;

import xml2csv.XmlProcessor;
import xml2csv.GuiStateWindow;
import xml2csv.GuiMainWindow;
import javax.swing.JOptionPane;
import java.io.File;

public class 
App
{
  public static 
void main(String[] args)
  {
    
App app = new App();
    
ThreadInfo t1 app.new ThreadInfo();
    
t1.start();   // startet ein Thread mit Output-Fenster
    
ThreadMain t2 app.new ThreadMain();
    
t2.start();   // startet ein Thread mit HauptFenster
  
}

  class 
ThreadInfo extends Thread
  
{
    public 
void run()
    {
      
System.out.println("Output-Frame wird geöffnet!");
      
GuiStateWindow gui GuiStateWindow.getInstance();
      
gui.setBounds(5050600600);
      
gui.setVisible(true);
//    Reaktivieren, um das Parsen ohne "OK"-Klick zu starten
//    App directConvert = new App();
//    directConvert.convert("C:/xml2csv/input.xml","C:/xml2csv/output.txt");
    
}
  }

  class 
ThreadMain extends Thread
  
{
    public 
void run()
    {
      
System.out.println("Main-Frame wird geöffnet!");
      
GuiMainWindow guiMain = new GuiMainWindow();
      
guiMain.setBounds(200200425200);
      
guiMain.setVisible(true);
    }
  }

// Diese Methode kann entweder aus dem Hauptfenster aufgerufen 
// wenn "OK"-Button angeklickt wird, oder direkt aus dem ersten Thread 
// gestartet werden (dafür auskommentierte Zeilen reaktivieren!).
// Zur korrekten Darstellung führt aber nur die zweite Alternative.
  
public void convert(String inputFileString outputFile)
  {
     
// Hier befindet sich die Konvertierungsroutine...
  
}

eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.07.2005, 18:32 Nach oben    #13
Benutzer
 
Registriert seit: 01.07.2005
Beiträge: 37
Standard

Also erstmal solltest du einer Klasse das Interface "Runnable" implementieren. In dieser leitest du auch die Methode "run", so wie du es mit den Thread Klassen gemacht hast, ab.
Innerhalb der "run" Methode kommt dann der Aufruf für den Code, der abgearbeitet werden soll.
In deiner Haupt-Klasse erzeugst du dann nur noch Thread-Objekte, welche auf diese Runnable Schittstelle basieren.
Ich würde auch Sicherheitshalber in die Methodensignaturen die brikant sind, das Schlüsselwort "synchronized" voran setzen. Damit sich die einzelnen Threads nicht im speichern durcheinanderkommen.
Aber viel mehr habe ich mit Threads auch noch nicht gemacht, deswegen kann ich dir nur raten, dass so zu probieren.
Hot-Thunder ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.07.2005, 09:31 Nach oben    #14
Neuer Benutzer
 
Registriert seit: 18.07.2005
Beiträge: 12
Standard

Das Problem ist (endlich) gelöst!
Mit Threads zu arbeiten - war schon richtige Richtung. Hab noch einen Tipp von einem Kollegen bekommen - ein Interface bauen und einen EventListener registrieren. Und das war's! InvokeLater() ist somit gar nicht nötig.
Vielen Dank nochmal für eure Hilfsbereitschaft!!!
eugenet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
warten auf Threads und Aufbau GUI desaster Allgemeine Java-Programmierung 7 07.09.2005 14:55
MVC Architektur, GUI Java17 Desktop-Applikationen und Grafik 3 03.03.2005 05:21
GUI Programmierung Java17 Literatur 1 28.02.2005 11:10
GUI Programmierung Java17 Allgemeine Java-Programmierung 11 17.02.2005 21:04
XML Schema GUI Engine (JAXFront) spor Nachrichten 2 05.08.2004 17:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45