ProgressMonitor

Status
Nicht offen für weitere Antworten.

Nekine

Mitglied
Hallo
Ich schreibe im Moment einen Email Client und wollte für die Übertragen der Mails eine Anzeige machen. Dafür bin ich auf den ProgressMonitor gestoßen.
Nun habe ich ein Programm gefunden das für die Zeit eines Timers der ProgressMonitor funktioniert.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Senden extends JFrame implements ActionListener {
    
	static ProgressMonitor ProgressMonitor;
	    static int counter = 0;
	    
	public Senden () {

		ProgressMonitor = new ProgressMonitor(null, "Status","Initializing . . .", 0,100);
		Timer timer = new Timer(50, this);
		timer.start();

	}
	    
	public static void main(String args[]) {
		UIManager.put("ProgressMonitor.progressText", "Senden....");
		UIManager.put("OptionPane.cancelButtonText", "Abbruch");
		new Senden ();
	}
	    
	public void actionPerformed(ActionEvent e) {
		SwingUtilities.invokeLater(new Update());
	}
	    
	class Update implements Runnable {
		public void run() {
			if (ProgressMonitor.isCanceled()) {
				ProgressMonitor.close();
				System.exit(1);
			}
			ProgressMonitor.setProgress(counter);
			ProgressMonitor.setNote("Senden: "+counter+"% gesendet");
			counter += 2;
		}
	}
}

Ersetze ich nun den Timer durch eine Methode erfolgt nur die Ausgabe der Zahlen aber es wird kein ProgressMonitor angezeigt... :

Java:
public Senden () {

		ProgressMonitor = new ProgressMonitor(null, "Status","Initializing . . .", 0, 100);
		Teste();

	}

public void Teste(){
		for(int i = 0;i<10000000; i++){
			System.out.println(i);
		}
}
 
S

SlaterB

Gast
solange ein ActionListener die eine lange Schleife abarbeiten muss, ist die GUI blockiert, wird nicht neugezeichnet,
denn sowas passiert nicht per Zauberei sondern durch irgendeine Ablaufkontrolle im Hintergrund, einen Thread,
und wenn der durch die Schleife an Arbeit erstickt, bleibt eben die GUI liegen,

Lösung:
- ideal wäre:
Java vorher kennenlernen, Themen wie GUI-Programmierung, Threads, usw.

- auf die Schnelle:
jede längerfristige Aktion in einem Listener in ein Konstrukt

Runnable r = new Runnable() {
public void run() {
// hier Code
}
};
new Tread(r).start();

packen
 

Nekine

Mitglied
Hatte ich schonmal probiert, hier der Code dafür:
trotzdem aber selbes Ergebniss keine Anzeige des ProgressMonitors.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Senden extends JFrame implements ActionListener {
    
	static ProgressMonitor ProgressMonitor;
	    static int counter = 0;
	    
	public Senden () {

		ProgressMonitor = new ProgressMonitor(null, "Status","Initializing . . .", 0, 100);
		ProgressMonitor.setProgress(0);
		Runnable r = new Runnable() {
			public void run() {
				Teste();
			}
		};
		r.run();
	}
	    
	public static void main(String args[]) {
		UIManager.put("ProgressMonitor.progressText", "Senden....");
		UIManager.put("OptionPane.cancelButtonText", "Abbruch");
		new Senden ();
	}
	    
	public void actionPerformed(ActionEvent e) {
		SwingUtilities.invokeLater(new Update());
	}
	    
	class Update implements Runnable {
		public void run() {
			if (ProgressMonitor.isCanceled()) {
				ProgressMonitor.close();
				System.exit(1);
			}
			ProgressMonitor.setProgress(counter);
			ProgressMonitor.setNote("Senden: "+counter+"% gesendet");
			counter += 2;
		}
	}
	
	public void Teste(){
		for(int i = 0;i<10000000; i++){
			System.out.println(i);
		}
	}
}
 
S

SlaterB

Gast
> r.run()
hast du da stehen, das ist ein ganz normaler Methodenaufruf und der AWT-Thread muss wieder alles knechten

nur
new Thread(r).start();
startet einen neuen separaten Thread, so dass der AWT-Thread sich wieder allein ums Zeichnen kümmern kann
 

Nekine

Mitglied
Sry war mein alter Code den ich vorher geschriben habe hab jetzt mal ersetzt
trotzdem noch keine Anzeige.

Java:
Runnable r = new Runnable() {
	public void run() {
		Teste();
	}
};
new Thread(r).start();
 
S

SlaterB

Gast
kompliziertes Ding dieser ProgressMonitor, da musste ich auch erst mal nachschlagen wie der geht,
und wenn man nicht eine gewisse Zeit vergehen läßt und den Wertebereich genau beachtet, dann zeigt der sich gar nicht erst,

dein Programm ist davon aber noch weit entfernt,
bzw. nur .setProgress(0); reicht nicht für die Anzeige,
die Teste()-Methode macht dann gar nix mit dem ProgressMonitor, Update() wird nicht genutzt

wenn du nur am Anfang was sehen willst, dann geht anscheinend

Java:
        ProgressMonitor.setProgress(0);
        try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        ProgressMonitor.setProgress(4);
ansonsten muss ein richtiger Ablauf her
 

Nekine

Mitglied
wieso funktioniert es dann wenn ich einer Timer laufen lasse?

Also:
Java:
Timer timer = new Timer(500, this);
timer.start();

Nun ersetzte ich dieses mit meiner Methode und es funktioniert nicht mehr. In beiden fällen mache ich nichts mit Update funktionieren tuts aber nur beim Timer...
 
S

SlaterB

Gast
bei mir passiert da nix, nur wenn ich z.B.
Thread.sleep(300);
in die main-Methode schreibe,

dann läuft der Timer an und unendlich lange und der ruft den ActionListener auf -> Update
 

Marco13

Top Contributor
Ohne jetzt in die Doku gesehen zu haben: Da war glaubich was, dass man einstellen konnte, nach welcher Zeit er erscheint...
 

Nekine

Mitglied
ProgressBar geht auf läuft bis 100 durch und wird beendet.
Wo wird den das Update aufgerufen?

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Senden extends JFrame implements ActionListener {
    
	    static ProgressMonitor ProgressMonitor;
	    static int counter = 0;
	    
	    public Senden() {
		super("Mail senden");
		setSize(250,100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		ProgressMonitor = new ProgressMonitor(null, "Status","Initializing . . .", 0, 100);

		Timer timer = new Timer(500, this);
		timer.start();
		setVisible(true);
	    }
	    
	    public static void main(String args[]) {
		UIManager.put("ProgressMonitor.progressText", "Senden....");
		UIManager.put("OptionPane.cancelButtonText", "Abbruch");
		new Senden();
	    }
	    
	    public void actionPerformed(ActionEvent e) {
		SwingUtilities.invokeLater(new Update());
	    }
	    
	    class Update implements Runnable {
		public void run() {
		    if (ProgressMonitor.isCanceled()) {
			ProgressMonitor.close();
			System.exit(1);
		    }
		    ProgressMonitor.setProgress(counter);
		    ProgressMonitor.setNote("Senden: "+counter+"% gesendet");
		    counter += 2;
		}
	    }
}
 
S

SlaterB

Gast
Timer timer = new Timer(500, this);
ruft alle 500ms actionPerformed() von this auf

so sind Timer nun mal, freche Biester
 

Nekine

Mitglied
Ok daher mein Denkfehler.

Gibs den eine möglichkeit wie ich beim senden einer Mail (Mail Api bei transport.sendMessage(message, message.getAllRecipients()); von transport = new SMTPTransport(session, new URLName("smtp", host, port , null, user, pw));)
herausfinden kann wie lange es dauert um die ProgressMonitor anzeigen zu können?
 
S

SlaterB

Gast
wie kommst du denn darauf, dass es länger als eine ns dauert und du überhaupt einen ProgressMonitor brauchen wirst?
hast du das schon mal ausgeführt und musstest du dabei etwas warten?
-> na da hast du doch einen ersten Erfahrungswert,
diese Zeit kannst du in dein Programm verbauen,

wenn du es ganz schick machen willst, dann lasse das Programm zur Laufzeit immer mitmessen und die nächsten ProgressMonitore noch genauer bauen,
vielleicht kann das Programm sogar für zukünftige Ausführungen die Zeit im Voraus schätzen, z.B. abhängig von der Tageszeit/ Zeitzone:
20.00 in Deutschland ist viel los, also bisschen mehr Zeit vorsehen
 

Nekine

Mitglied
Sry hab mich ungenau ausgedrückt. Nicht "normale" Mails sondern Mails mit Anhang (dauer Unbekannt da es von 1kb bis XXMB und Übertragungs-Geschwindigkeiten sich ändern können)
 
S

SlaterB

Gast
passt denn meine Antwort nicht? ob mit oder ohne Anhang, das meiste von meinem Posting gilt immer noch, abgesehen vielleicht von den 1 ns,

aber Anhänge sind ne gute Info, deren Länge kennst du doch oder kannst du herausfinden und das hilft beträchtlich beim Abschätzen,
 

Nekine

Mitglied
Dann müsste ich ja für 100 Dateien mindestens testen und für 3 Geschwindigkeiten...
Ich dachte es gäbe vielleicht eine Methode die das für mich erledig oder eine Möglichkeite die Bytes die gesendet werden müssen und die die schon übertragen sind abzufragen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
HarleyDavidson Threads ProgressMonitor wird nicht angezeigt! Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben