ProgressMonitor funktioniert nur beim Initialisieren

beastofchaos

Bekanntes Mitglied
Hallo Leute,
Ich wollte mich endlich mal damit beschäftigen, solche hübschen Ladebalken zu basteln.

Bin dabei auf die Klasse ProgressMonitor gestossen.
Hier auch schon meine Methode, um das ganze zu testen:
Java:
public static void act(){
//    	UIManager.put("ProgressMonitor.progressText", "Newton-Fraktal erzeugen...");
//    	UIManager.put("OptionPane.cancelButtonText", "Abbrechen");
    	ProgressMonitor pbar = new ProgressMonitor(null, "Monitoring Progress", "Initializing . . .", 0, 100);
    	Point size = new Point(100, 100);
		double procent = 0;
		int progress = 0;
		for (int x = 0; x < size.x; x++){
			for (int y = 0; y < size.y; y++){
				// Berechnungszeit simulieren
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				// progress berechnen
				procent = 100 * x / size.x;
				progress = (int)Math.round(procent);
				
				// progress soll abgerundet werden
				if (progress > procent){
					progress -= 1;
				}
				if (x == size.x - 1 && y == size.y - 1){
					progress = 100;
				}
				
				// progress anzeigen (immer 3-Stellige Koordinaten)
	            pbar.setProgress(progress);
	            String sx = "" + x;
	            String sy = "" + y;
	            if (x < 10){
	            	sx = "00" + x;
	            }
	            else if (x < 100){
	            	sx = "0" + x;
	            }
	            if (y < 10){
	            	sy = "00" + y;
	            }
	            else if (y < 100){
	            	sy = "0" + y;
	            }
	            pbar.setNote("[" + sx + ";" + sy + "] -> " + progress);
			}
		}
	}

Das funktioniert auch, wenn ich es direkt in der main-Methode aufrufe.
Doch, wenn ich jetzt über einen Button oder über SwingUtilities.invokeLater() die Methode aufrufe ist das Pop-Up ein weißes Fenster (?)

Java:
SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				act();
			}
		});
oder
Java:
button.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				act();
			}
		});

Woran könnte das liegen?
Gruß, Thomas
 
Zuletzt bearbeitet:
Der ActionListener wird im EDT ausgeführt. In deiner Methode lässt du diesen aber mit Thread.sleep() schlafen, d.h. er wird solange nichts zeichnen können.
Du musst den Fortschritt deines Monitors in einem extra Thread laufen lassen.
 

Zurück
Oben