Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster

taaz

Mitglied
Hallo,

ich versuche mal mein Problem etwas zu schildern.
Da ich aber eine ganze menge Code dafür habe, lasse ich den erstmal weg und liefere den auf Anfrage nach.

Ich habe ein Fenster (JFrame), wo ich eine ProgressBar platziert habe, welche sich bewegt (setIndeterminate(true)).
Sobald ich nun eine Aktion ausführe (Button drücken oder Enter tippen), hält die ProgressBar an, bis der Code in actionPerformed bzw. keyReleased ausgeführt wurde.
Danach bewegt sich die ProgressBar weiter.

Was mache ich falsch? 🙁

lg
taaz

Hier doch nochmal etwas Code:
Java:
@Override
    public void actionPerformed(ActionEvent e) {
    	System.out.println("actionPerformed started");
		
        if(e.getSource() == login){
			
            System.out.println("actionPerformed == login");
        	
            Session session = new Session(nameTxt.getText(), new String(passwordTxt.getPassword()));
            if(session.getLogin() == true){
                new MainScreenGUI();

            	//pb.setIndeterminate(false);
                this.dispose();
            }else{
            	//new ErrorDialog("Sie haben ein falsches Passwort eingegeben!");
            	passwordTxt.setText("");
            	passwordTxt.requestFocusInWindow();
            }
        
        }
    }


	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_ENTER){

			System.out.println("ENTER erkannt");
			
			
			actionPerformed(new ActionEvent(login, 1001, "Einloggen"));
			
			System.out.println("ActionPerformed finished");
			
		}
	}
 
Du brauchst halt neben dem EDT noch einen weiteren Thread, der die Progressbar updatet.
Ob du nun eine Klasse schreibst die Thread erweitert, oder Runnable implementiert, oder ob du es mit SwingWorker versuchst, bleibt dir überlassen...vom geschilderten Verhalten lässt sich ableiten, dass deine Progressbar auf deinem EDT läuft und im Moment des Buttonsklick in die entsprechende actionPerformed-Methode springt, dort die Befehle ausführt und erst dann weiter zeichnet, wenn sie wieder zurückgekehrt ist.
 
Da du, so wie ich das verstehe, ja einen Progressbar haben willst, der einfach herumprogressed brauchst du dafür keinen eigenen Thread, für das neue Fenster aber schon. Du darfst so wie jgh gesagt hat deine Mainscreen GUI nicht im EDT deines Fensters erstellen. Mach Eventqueue.invokeLater
Java:
EventQueue.invokeLater( new Runnable() 
{ 
  public void run() { 
    new MainScreenGUI();
  } 
} );
 
Danke euch beiden für die Antworten.
Für mich sieht der Vorschlag von bERt0r leichter umzusetzen aus, allerdings habe ich es noch nicht hinbekommen.
Theoretisch müsste ich doch den Codeteil einfach nur kopieren und bei mir einfügen, oder?

Wahrscheinlich liegt es daran, dass ich die Progressbar an der falschen Stelle anspreche? Weil es wird ja trotzdem in die einzelnen Methoden gesprungen?

Vor meinem new MainScreenGUI(); werden ja noch einige andere Abfragen ausgeführt, um den Login zu verifizieren. Schon dabei bleibt ja meine ProgressBar stehen.

Ich brauche hier nochmal einen Gedankenanstoß 🙂

lg
taaz
 
ich sehe keinen Sinn in der Aussage von bERt0r,
EventQueue.invokeLater() läßt etwas in dem AWT-Thread ausführen, aber da läuft der ActionListener sowieso schon,
es ist nichts gewonnen,
ein separater Thread wird wahrscheinlich benötigt, wie schon gesagt wurde,
wobei zum Teil geraten werden muss, es fehlt kompletter Code zu deiner ProgressBar

siehe auch etwas umfangreicher:
http://www.java-forum.org/bilder-gu...-progressbars-algorithmen-multithreading.html
 
Java:
EventQueue.invokeLater( new Runnable() 
{ 
  public void run() { 
    new MainScreenGUI();
  } 
} );
Sagt dem EDT er soll einen neuen Thread (Runnable) starten der dann eben das Fenster aufmacht.
Wenn du in deinem Main Programm auf die Art und weise 2 mal den gleichen Frame startest werden die ja auch parallel angezeigt und nicht nacheinander und da ist auch keiner davon Modal.
edit: Damit meine ich sowas:
Java:
EventQueue.invokeLater( new Runnable() 
{ 
  public void run() { 
    new MainScreenGUI();
  } 
} );
EventQueue.invokeLater( new Runnable() 
{ 
  public void run() { 
    new MainScreenGUI();
  } 
} );
 

Zurück
Oben