GUI "einfrieren"?

Status
Nicht offen für weitere Antworten.

gigi99

Mitglied
Hallo!
Ich habe einen Wizard programmiert.
Wenn der Benutzer "next" klickt, wird erst mal ganz viel gerechnet, dann geht es nach ca. 10 Sekunden weiter.
Wenn ich in der Zwischenzeit was anderes in Windows mache (ein anderes Fenster kommt in den Vordergrund), dann zeigt die Java-Wizard-Oberfläche relativ wirre Sachen aus fremden Windows-Fenstern.

Ich hätte aber gern, dass sie einfach so bleibt ("einfriert").

Weiß jemand eine Lösung für das Problem?

Habe damit rumprobiert, aber es hat nicht geklappt:
Code:
	        SwingUtilities.invokeLater(new Runnable()
	        {
	            public void run()
	               {
	         
	            
	               }
	        });

Besten Dank!
 

byte

Top Contributor
Du musst die lange dauernde Operation in einen eigenen Thread auslagern. Solltest Du dann aus diesem Thread auf eine (nicht threadsichere) GUI-Komponente zugreifen, musst Du den von Dir geposteten Code-Ausschnitt verwenden.
 

Tobias

Top Contributor
Ein Wizard öffnet sich ja üblicherweise in einem Dialogfenster. Dieses modal setzen. Wenn der Benutzer auf "Next" gedrückt hat, den Next-Button (und alle anderen vorhandenen aktiven Komponenten) deaktivieren und den Cursor durch eine Sanduhr ersetzen, fertig.
 

byte

Top Contributor
So einfach ist es nicht. Wenn der EDT hängt, merkst Du das auch, wenn Du z.B. das Fenster minimierst/maximierst oder den Dialog verschiebst.
 

Tobias

Top Contributor
Achso, der EDT hängt, daher die wirren Sachen - ich dachte der zeigt wirre Sachen an, weil er mit unvollständigen Daten weiterarbeitet. Naja, dann natürlich wie von Byto geschrieben und meine Hinweise lediglich als Usability-Verbesserungen ansehen (falls überhaupt auf das Berechnungsergebnis gewartet werden muss).
 

gigi99

Mitglied
Danke für die Antworten.
Habe das Problem so gelöst (basiert auf JWizard http://flib.sourceforge.net/JWizard/doc/index.html)

Code:
//........ (Step1)
		/** 
		 * go to next step 
		 */
		protected void next() 
		{
			new ThreadWorkerStep2( ).start(); 
		}
		
		
		public class ThreadWorkerStep2 extends Thread 
		{ 
		  @Override 
		  public void run() 
		  { 
			// hard time-consing work...
			// ...
			// ...


			    SwingUtilities.invokeLater(new Runnable()
			    {
				    public void run()
				    {
				        Step2.super.next();
				    }
			    });				
				
		  } 
		}
// .........
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben