JProgressBar wird nicht richtig angezeigt

MasseElch

Aktives Mitglied
Hallo Forum,

ich habe eine Methode, die Ordner durchsucht.
Die kann ich mit setIndeterminate() so setzen, dass sie dann diesen blau laufenden Balken anzeigt. Denn ich weiß leider (aufgrund einer Rekursion) nicht, wie ich den Fortschrittberechnen soll. Darum soll einfach nur der Balken da drinne hin und her laufen.

Ich habe es auf zwei Weisen versucht:

Ich habe ein Fenster, zeige da die Bar und ein JLabel. Dann rufe ich die Methode auf, damit sie sucht, nach der Methode wird das Fenster geschlossen. Problem: Es tut sich nichts.

Java:
//Show the ProgressBar while searching
		 JFrame frame = new JFrame("Es wird gesucht");
		 frame.pack();
		 frame.setVisible(true);
		 frame.setAlwaysOnTop(true);		 
		 JProgressBar pBar = new JProgressBar();
		 pBar.setIndeterminate(true);
		 frame.add(new JLabel("Suche läuft..."));
		 frame.add(pBar);		 
		 frame.setLayout(new GridLayout(2,1));
		 frame.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width/2, screenHeight/2);
		 frame.setSize(230, 75);

		 //search the files
		 this.listDir(dir);
		 
		 //close Progressbar
		 frame.dispose();

Also wollte ich es mit einem Thread machen, der halt während der Suche die ProgressBar anzeigt und danach beendet.

Java:
class ShowProgressBar implements Runnable {
		public void run() {
			JFrame frame = new JFrame("Es wird gesucht");
			
			frame.setLayout(new GridLayout(2,1));
			frame.pack();
			frame.setVisible(true);
			frame.setAlwaysOnTop(true);
			
			frame.add(new JLabel("Suche läuft..."));
			JProgressBar pBar = new JProgressBar();
			frame.add(pBar);
			pBar.setIndeterminate(true);
			
			frame.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width/2, screenHeight/2);
			frame.setSize(230, 75);
			
			while(search) {}
			frame.dispose();
		}
	}
Java:
//new Thread
		 Thread t = new Thread(new ShowProgressBar());
		 t.start();
		 
                 this.search = false;
		 this.listDir(dir);

Dann funktioniert die ProgressBar, blöd ist aber, dass sie erst dann angezeigt wird, sobald die Methode listDir() fertig ist! Das Frame ist schon vorher da. Die ProgressBar und das Label werden erst angezeigt, nachdem die Methode durch ist. Und da ich direkt nach dem Ende der Methode die Variable Search auf false setze, wird das Fenster geschlossen. Dass die ProgressBar läuft, sehe ich nur, wenn ich search gar nicht auf false setze.

Was mache ich verkehrt?

Lg
MasseElch
 
Damit die ProgressBar flüssig läuft halte ich einen Thread, der sie steuert für besser.

Hast du schon mal debuggt? Vielleicht hast du eine Endlosschleife mit der Rekursion gebaut?
 
Hallo,

gut, dann mit dem Thread.

Die Rekursion terminiert. Hab sie vorher ohne die Progressbar laufen lassen.
Wollte die jetzt zusätzlich einfügen um den Nutzer ein Feedback zu geben, dass auch was getan wird.

Nur springt sie halt erst an, wenn die Methode terminiert und nicht, wie erhofft, während die läuft.
 
Hallo,

gut, dann mit dem Thread.

Die Rekursion terminiert. Hab sie vorher ohne die Progressbar laufen lassen.
Wollte die jetzt zusätzlich einfügen um den Nutzer ein Feedback zu geben, dass auch was getan wird.

Nur springt sie halt erst an, wenn die Methode terminiert und nicht, wie erhofft, während die läuft.

EDIT:


Es ist natürlich so rum: Hab auch grad noch mal nachgeschaut, es steht so im COde:

Java:
[//new Thread
         Thread t = new Thread(new ShowProgressBar());
         t.start();
         this.listDir(dir);
         this.search = false;
 
Zuletzt bearbeitet:
Nein leider nicht.

Also noch Mal genauer:

Ich starte den Thread, der das Frame mit der ProgressBar anzeigen soll:

Java:
//new Thread
Thread t = new Thread(new ShowProgressBar());
t.start();
this.listDir(dir);

Danach rufe ich die Methode listDir() auf.

Nun passiert folgendes:

Das Frame wird angezeigt. Aber ohne irgend ein Element drin. Es sieht aus wie ein leeres Frame. Sobald die Methode listDir() terminiert wird die ProgressBar angezeigt.

Sie soll aber während der Zeit, in der die Methode läuft angezeigt werden. Nicht erst dann, wenn die Methode ihre Arbeit fertig gemacht hat.

Hier noch ein Mal die Implementierung von Runnable:
Java:
class ShowProgressBar implements Runnable {
        public void run() {
            JFrame frame = new JFrame("Es wird gesucht");
            
            frame.setLayout(new GridLayout(2,1));
            frame.pack();
            frame.setVisible(true);
            frame.setAlwaysOnTop(true);
            
            frame.add(new JLabel("Suche läuft..."));
            JProgressBar pBar = new JProgressBar();
            frame.add(pBar);
            pBar.setIndeterminate(true);
            
            frame.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width/2, screenHeight/2);
            frame.setSize(230, 75);
            
            while(search) {}
            frame.dispose();
        }
    }
 
Zuletzt bearbeitet:
Hier hab ich mal auf die schnelle ein kleines lauffähiges Programm geschrieben (zum testen). Beim Klick auf den Button erscheint eine Progressbar...

Vielleicht kannst du anhand dieses Codes deinen Fehler finden.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.ProgressMonitor;

/**
 *
 * @author Dominik Sust
 * @creation 11.09.2013 09:38:10
 */
public class ProgressBarTest extends JFrame
{

    public static void main( String[] args )
    {
        new ProgressBarTest().start();
    }

    private void start()
    {
        this.setSize( 300, 300 );
        this.setVisible( true );
        this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        JButton b = new JButton( "Calculate" );
        this.add( b );
        b.addActionListener( new ClickCalculateButton() );
    }

    private class ClickCalculateButton implements ActionListener
    {

        @Override
        public void actionPerformed( ActionEvent e )
        {
            Thread t1 = new Thread( new SetProgressBar() );
            t1.start();
        }
    }

    public class SetProgressBar implements Runnable
    {

        @Override
        public void run()
        {
            ProgressMonitor _status = new ProgressMonitor( null, "Message", "Note", 0, 100 );

            for ( int j = 0; j <= 100; j++ )
            {
                try
                {
                    Thread.sleep( 40 );
                }
                catch ( InterruptedException ex )
                {
                    Logger.getLogger( ProgressBarTest.class.getName() ).log( Level.SEVERE, null, ex );
                }
                _status.setProgress( j );
            }
        }
    }
}
 
Ich habe nun den von dir vorgeschlagenen ProgressMonitor genommen und es funktioniert.

Ich weiß leider nicht wo der Fehler lag im alten Code,

aber mit dem was ich jetzt habe klappt es super.

Danke allen Helfern!
 

Neue Themen


Zurück
Oben