2 GUI-Fenster. 2.Fenster wird nicht aufgebaut, wenn erstes beschäftigt ist.

D

die3.lustigen.4

Gast
Moin,

Mein Program soll mit einem SAX-Parser eine XML überprüfen.
Mit der Haupt-GUI sollen sämtliche Einstellungen durch den Benutzer gesammelt werden. So soll auch die XML beim einbinden einmal "vorgeparst" und überprüft werden.
Da die XMLs mehrere 100 MB groß werden können, wollte ich ein kleines Info-Fenster aufploppen lassen mit "Please Wait..." und einer indeterminate JProgressBar.
Die Fenster funktionieren einzeln, aber zusammen wird der Inhalt vom Infofenster nicht aufgebaut, wenn das Hauptfenster parst. Ich weis nicht genau ob es nun ein GUI- oder ein Thread-Problem ist.

Verwendet wird Java 6 und Eclipse Gallileo.

3 Ansätze habe ich schon versucht, aber alle brachten das gleiche Ergebnis...


1. Ansatz Hauptfenster baut Infofenster:

Die Haupt-GUI wird mit meiner Main-Funktion (eigene Klasse) so aufgerufen:

[SPOILER="Main-Funktion" ]
Java:
EventQueue.invokeLater(new Runnable() {
	public void run() {
		try {
			FinalGUI frame = new FinalGUI();
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
});
[/SPOILER]
Die XML wird dann über einen ActionListener eingebunden und eine Methode innerhalb der Klasse FinalGUI aufgerufen:

[SPOILER="Methode in Haupt-GUI" ]
Java:
	private Projectinfos projectinfos;
	private AllLanguages allLanguages;
	...


	private boolean langugageParsing(String path, boolean countEntries){
		
	//Infofenster erstellen
		Thread info = new Thread (new InfoWhileParsing(this, "Linguist-XML", path));
		info.start();
      

		
		boolean oldProjectequalsNewProject=false;
		
	//XML Parsen
		LanguageParsing paLa= new LanguageParsing(path, projectinfos, countEntries);

		oldProjectequalsNewProject= paLa.startParsing();
		allLanguages= paLa.getAllLanguages();
	... //auswertung der Sprachen und Projekteigenschaften.

	//Infofenster beenden
		infoThread.interrupt();
}
[/SPOILER]
Die Klasse die das Infofenster erzeugt sieht so aus:

[SPOILER="Infofenster Klasse" ]
Java:
public class InfoWhileParsing extends JFrame implements Runnable {
 
	private JTextPane txtPnLog;
	private JPanel contentPane;
	private JProgressBar progressBar;


    
	public InfoWhileParsing(JFrame owner, String nameOfObjectToPars, String path) {
		
		setResizable(false);
		setTitle("Parsing...");
		Toolkit.getDefaultToolkit().setDynamicLayout(true);


		contentPane = new JPanel();
        String text ="Loading " + nameOfObjectToPars + ":\n " + path + "\n\nPlease wait... ";


		setBounds(100, 100, 309, 190);

		contentPane.setBackground(Color.WHITE);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
	
		txtPnLog = new JTextPane();
		txtPnLog.setText(text);
		contentPane.add(txtPnLog);
		txtPnLog.setBounds(10, 11, 283, 121);
		
		JProgressBar progressBar = new JProgressBar();
		progressBar.setToolTipText("");
		progressBar.setForeground(new Color(51, 204, 0));
		progressBar.setIndeterminate(true);
		progressBar.setBounds(75, 140, 150, 16);
		contentPane.add(progressBar);
		
        setLocationRelativeTo(owner);

    }
 
    @Override
    public void run() {
		
		  while(!Thread.currentThread().isInterrupted()){

			  try {
			  Thread.currentThread().sleep(200);

		  		} catch (InterruptedException e) {
		  			
		  			Thread.currentThread().interrupt();
		  		}
		  
  	
		  Thread.currentThread().interrupted();
		  System.out.println("test");
		  dispose();

    	}
    }
}
[/SPOILER]
Resultat: Vom Infofenster sieht man nur den Rahmen. Inhalt wird nicht aufgebaut.



2. Ansatz: Timer statt sleep.

Brachte keine Änderung.

Nach Gesprächen mit Kommilitonen, kam der nächste Ansatz.


3. Ansatz: Infofenster vor Hauptfenster erzeugen und mit Interrupts und setVisible ein bzw. ausblenden.

Main-Funktion:
[SPOILER="Main-Funktion" ]

Java:
		final Thread infoWindow = new Thread (new InfoWhileParsing());
		infoWindow.start();
		

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					FinalGUI frame = new FinalGUI(infoWindow);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
[/SPOILER]
Parser-Methode die durch den ActionListener innerhalb der Haupt-GUI aufgerufen wird:
[SPOILER="Methode in Haupt-GUI" ]

Java:
	private boolean langugageParsing(String path, boolean countEntries){
		
	//InfoFenster anzeigen
		infoThread.interrupt();
      

		
		boolean oldProjectequalsNewProject=false;
		
		LinguistLanguageParsing paLa= new LinguistLanguageParsing(path, projectinfos, countEntries);

		oldProjectequalsNewProject= paLa.startParsing();
		allLanguages= paLa.getAllLanguages();

	... //auswertung der Sprachen und Projekteigenschaften.

	//InfoFenster nicht mehr anzeigen

		infoThread.interrupt();
[/SPOILER]
Und die geänderte Infofenster Klasse.
[SPOILER="Infofenster Klasse" ]

Java:
public class InfoWhileParsing extends JFrame implements Runnable {
 
	private JTextPane txtPnLog = new JTextPane();
	private JPanel contentPane;
	private JProgressBar progressBar;

    
	public InfoWhileParsing() {
		
		setResizable(false);
		setTitle("Parsing...");
		Toolkit.getDefaultToolkit().setDynamicLayout(true);


		contentPane = new JPanel();
        String text ="Loading " + "\n\nPlease wait... ";


		setBounds(100, 100, 309, 190);

		contentPane.setBackground(Color.WHITE);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
	
		txtPnLog = new JTextPane();
		txtPnLog.setText(text);
		contentPane.add(txtPnLog);
		txtPnLog.setBounds(10, 11, 283, 121);
		
		JProgressBar progressBar = new JProgressBar();
		progressBar.setToolTipText("");
		progressBar.setForeground(new Color(51, 204, 0));
		progressBar.setIndeterminate(true);
		progressBar.setBounds(75, 140, 150, 16);
		contentPane.add(progressBar);
		


    }
 
    @Override
    public void run() {
    	
    	while(true){	
		
		  while(!Thread.currentThread().isInterrupted()){

			  try {
			  Thread.currentThread().sleep(200);

		  		} catch (InterruptedException e) {
		  			
		  			Thread.currentThread().interrupt();
		  		}
		  		repaint();
		  }
    	
		  Thread.currentThread().interrupted();
		  System.out.println("test");

		  setVisible(!isVisible());		
    	}
    }
}
[/SPOILER]
Resultat: Vom Infofenster sieht man wieder nur den Rahmen. Inhalt wird nicht aufgebaut.



Das Parsen in einen eigenen Thread stecken wollte ich eigentlich nicht, weil dann alle Variablen final werden müssen und die Zugriffe auf die Parser-Klasse schwieriger werden.

Ich habe den ganzen Freitag an diesem Problem gewerkelt und diverse Internetseiten durchsucht und leider kein ähnliches Problem gefunden.
Vielleicht seht ihr ja auf Anhieb, was ich falsch mache bzw. was fehlt.

Aber falls dieses Thema schonmal behandelt wurde, könntet ihr mir dann sagen unter was ich dieses Problem finden kann?


Vielen Dank schonmal.

Rico
 
D

die3.lustigen.4

Gast
Okay, danke vanny.

Aber mich verwirrt, dass die Run Methode des Info-Thread parallel zu laufen scheint.
Ich habe jetzt mal die Konsolenausgabe "Test" in die while(!isInterrupted())-Schleife getan. Hier bekomme ich die Konsolenausgabe "Test" kontinuierlich, wenn der Thread läuft, obwohl das Hauptfenster gerade parst.

Beim 3. Ansatz hatte ich schon in der Main Methode beide GUIs in einzelne Threads gesteckt (denke ich zumindest) und mit Interrupts das Infofenster gesteuert. Aber auch hier wird, wenn die Haupt-GUI beschäftigt ist, der Inhalt vom Infofenster nicht angezeigt. Die Run-Methode gibt trotzdem kontinuierlich Konsolenausgabe "Test" aus.

Also habe ich doch meine gewünschte Parallelität? Nur der Inhalt baut sich nicht auf...
Ist es dann immernoch ein Thread-Problem oder doch ein GUI-Problem?
 
V

vanny

Gast
Es handelt sich wohl eher um ein Verständnisproblem.
Deine GUI egal ob 1 oder 100 Fenster läuft im EDT und das ist auch gut so.
Deine Parseaktion (nur die) gehört in einen seperaten Thread. wenn dann wieder was an der GUI geändert wird(Progressbar zBsp.) dann übergibste mit invokeLater nur diese Aktion an den EDT weiter.

Das ganze gibts auch in "benutzerfreundlich" (<<Geschmackssache) und nennt sich SwingWorker.

Gruß Vanny
 
D

die3.lustigen.4

Gast
Gut sowas habe ich mir fast schon gedacht. Deswegen hatte ich ja auch den 3. Ansatz versucht, aber wenn es nur einen EDT gibt, dann bringt das ja auch nix.

Habe mir mal eben Swingworker angeguckt, ist auf dem ersten Blick nix anderes als Runnable mit ner Rückgabe...
Egal, also werde ich wohl mal einen Thread drumbasteln.

Danke für deine Hilfe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
F Fenster wird nicht angezeigt!? AWT, Swing, JavaFX & SWT 3
C AWT Buttons verschwinden, wenn Fenster Vollbild gesetzt wird AWT, Swing, JavaFX & SWT 38
R Fensterinhalt erscheint erst, wenn das Fenster verändert wird AWT, Swing, JavaFX & SWT 7
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
A Fenster bzw. Frame wird nicht immer sichtbar AWT, Swing, JavaFX & SWT 12
B scrollbare jtoolbar sobald fenster zu klein wird AWT, Swing, JavaFX & SWT 5
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
OZAN86 einfaches Fenster öffnen scheitert AWT, Swing, JavaFX & SWT 18
G Zuletzt aktives Fenster, vor dem aktuell aktiven AWT, Swing, JavaFX & SWT 2
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
O JavaFX Fenster scließen AWT, Swing, JavaFX & SWT 4
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
B AWT Fenster schließt nicht AWT, Swing, JavaFX & SWT 2
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
K JavaFX ObservableList + Fenster AWT, Swing, JavaFX & SWT 6
windl Transparentes / halbtransparentes Fenster AWT, Swing, JavaFX & SWT 1
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
N Swing Sorry nicht mal ein Fenster öffnen... AWT, Swing, JavaFX & SWT 19
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
X Swing 2 Fenster (1 im Vordergrund) AWT, Swing, JavaFX & SWT 6
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
Tort-E JavaFX Fenster nachladen AWT, Swing, JavaFX & SWT 1
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
U Fenster beim Vergörßern immer quadratsich AWT, Swing, JavaFX & SWT 7
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
I Swing Beim Fenster das kleine Symbol(ICS) ändern AWT, Swing, JavaFX & SWT 3
K JavaFX Vorschau Bereich/Fenster einer bestehenden Group AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben