# (Applets) JProgressBar wird erst am Ende angezeigt



## Sued_Faust (2. Aug 2010)

Moin,

wie der Titel schon sagt liegt mein Problem dadrin, dass ich eine JProgressBar in meinem Applet eingebaut habe aber sie erst gegen Ende angezeigt wird. Vorher sieht man nur ein ganz kleienn Teil eines Labels. 

Hier mal relevanter Code:


```
public void runApplet(String siteID, String containerID,
			String UploadDirectory, String updatenoderf, String filename,
			String description, String majorversion, String overwrite,
			String thumbnails) {

                // Erstellt die Gui für die ProgressBar.
		buildGUI();

		// Legt alle Parameter aus dem JS-Aufruf in das Objekt ab.
		jsPara.setSiteID(siteID);
		jsPara.setContainerID(containerID);
		jsPara.setUploadDirectory(UploadDirectory);
		jsPara.setUpdatenoderef(updatenoderf);
		jsPara.setFilename(filename);
		jsPara.setDescription(description);
		jsPara.setMajorversion(majorversion);
		jsPara.setOverwrite(overwrite);
		jsPara.setThumbnails(thumbnails);

		boolean fileUpload = false;

		// Prüft ob ein File-Upload stattfindet.
		fileUpload = checkForFileUpload();

		fileIO = new FileIO(fileUpload, jsPara);

		// Lädt gesuchte Datei.
		boolean canceled = AccessController
				.doPrivileged(new PrivilegedAction() {
					public Object run() {
						return fileIO.loadFile();
					}
				});
		if (canceled == false) {
			int fileListLength = jsPara.getFiledata().length;
			for (fileIndex = 0; fileIndex < fileListLength; fileIndex++) {
				// Setzt das Label entsprechend.
				if (fileListLength > 1) {
					label.setText("Uploading(" + (fileIndex + 1) + "/"
							+ fileListLength + ")...");
				} else {
					label.setText("Uploading...");
				}

				// Leitet den Upload ein.
				runUpload(fileUpload, canceled);
			}

			// Setzt default-Werte
			try {
				setDefault();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}
	}

	public void buildGUI() {
		// Erstellt ein Panel.
		panel = new Panel(new BorderLayout());
		this.setBackground(new Color(255, 251, 255));

		// Erstellt ein Label.
		label = new Label();

		// Übergibt dem Panel die ProgressBar und das Label.
		panel.add(pb, BorderLayout.SOUTH);
		panel.add(label, BorderLayout.NORTH);

		// Übergibt dem Applet-Frame das Panel.
		add(panel);

		// Macht das Panel sichtbar.
		setVisible(true);
	}

public void runUpload(boolean fileUpload, boolean canceled) {
		// Setzt den Namen der Datei die hochgeladen werden soll(Nur bei
		// FileUpload).
		if (fileUpload == true) {
			jsPara.setFilename(jsPara.getFiledata()[fileIndex].getName());
			jsPara.setUpdatenoderef("");
		}

		// Holt den Mime-Type der Datei.
		jsPara.setContenttype(getMimeType());

		// Erstellt eine neuen Thread.
		thread = new Thread(new Runnable() {
			@Override
			public void run() {
				doit();
			}
		});
		// Startet den Thread mit der eigentlichen Upload-Logik.
		thread.start();

		// Wartet bis der Thread seine Aufgaben erledigt hat.
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public void doit() {
		try {
			// Das Boundary wird initialisiert.
			String boundary = "-----------------------------" + randomString()
					+ randomString();

			// Öffnet eine Verbindung zum Server.
			openConnection(boundary);

			// Schreibt die Request.
			writeReq.run(conn, jsPara, boundary, pb, fileIndex);
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} catch (PrivilegedActionException pae) {
			pae.printStackTrace();
		}

		try {
			SwingUtilities.invokeAndWait(new Runnable() {
				public void run() {
					// Bekommt eine Antwort vom Server (Testzwecke!).
					try {
						responseCode = getResponseFromServer();
					} catch (IOException e) {
						e.printStackTrace();
					}

					// Trennt die Verbindung zum Server.
					disconnectFromServer();

					if (responseCode == RESPONSE_CODE_200) {
						// Löscht Datei vom lokalem System.
						AccessController.doPrivileged(new PrivilegedAction() {
							public Object run() {
								fileIO.deleteFile();
								return null;
							}
						});
					}
				}
			});
		} catch (InterruptedException ie) {
			ie.printStackTrace();
		} catch (InvocationTargetException ite) {
			ite.printStackTrace();
		}
	}
```

Danke im vorraus!


----------



## Sued_Faust (2. Aug 2010)

Dazu muss ich sagen, dass wenn ich die buildGUI() methode in die init() Methode meines Applets stecke, funktioniert es wunderbar.
Sollte noch Code fehlen bescheid sagen!

Gruß


----------



## SlaterB (2. Aug 2010)

> aber sie erst gegen Ende angezeigt wird

am Ende von was?
nach buildGUI(); sollte die Aktion eigentlich zu Ende sein, dann willst du ja sicher dass die GUI angezeigt wird,
alles andere gehört eher in einen separaten Thread, wie du es in früheren Themen doch schon hattest?
http://www.java-forum.org/awt-swing-swt/103777-problem-jprogressbar.html


----------



## Sued_Faust (2. Aug 2010)

Naja Also die Progressbar und das Label werden erst nachdem die Datei hochgeladen wurden also der komplette Code durchlaufen wurde angezeigt. 
Ich würd es halt gern so haben, dass wenn die Methode runApplet() Aufgerufen wird meine Gui erstellt wird und dann die restlichen Aktionen, also das Hochladen statt findet.
Und wie gesagt wenn ich meine GUI durch die init Methode des Applets aufbauen lasse funktioniert es ja auch.
Was hab ich vergessen, damit es so funktionier wie beschrieben?


----------



## SlaterB (2. Aug 2010)

-->


SlaterB hat gesagt.:


> nach buildGUI(); sollte die Aktion eigentlich zu Ende sein, dann willst du ja sicher dass die GUI angezeigt wird,
> alles andere gehört eher in einen separaten Thread, wie du es in früheren Themen doch schon hattest?
> http://www.java-forum.org/awt-swing-swt/103777-problem-jprogressbar.html


<--


----------



## Sued_Faust (2. Aug 2010)

Tut mir leid verstehe nicht worauf du hinaus willst?! 
Könntest mir das bitte näher erläutern.
Ich habe doch den rest in einem seperaten thread?!


----------



## SlaterB (2. Aug 2010)

ich will darauf hinaus, dass nach setVisible(true) die Aktion zu Ende ist, denn dann erst wird die GUI angezeigt,
das war der erste Satz, habe ich jetzt nochmal neu geschrieben, kann eigentlich nicht verständlicher sein, ich versuchs trotzdem..

und ich will darauf hinaus, das alles restliche danach eben nicht mehr kommt, weil ja die Aktion zu Ende sein soll,
es steht dir aber frei einen separaten Thread aufzumachen, der irgendwas macht, das stört dann normalerweise nicht bei der Anzeige

das war der zweite Satz, sollte dir inhaltlich auch klar sein, weil du ja kürzlich auch schon Threads verwendet hattest


edit:
> Ich habe doch den rest in einem seperaten thread?! 

wo genau?
teste mit Auskommentieren, schalte testweise alles hinter buildGUI(); ab,
wenns dann erstmal klappt, dann Befehl für Befehl wieder rein und die siehst was wann wo warum langsam ist


----------



## Sued_Faust (2. Aug 2010)

in der Methode runUpload starte ich einen Thread der dann den Upload tätigt, davor dürfte die Gui doch eigentlich nix blockieren oder?


----------



## SlaterB (2. Aug 2010)

> davor dürfte die Gui doch eigentlich nix blockieren oder? 

dieser Satz ist komplett falsch 
wie gesagt: jeder einzelne Befehl nach setVisible(true) blockiert, bis dann endlich die Methode runApplet() fertig ist,
wer immer die aufruft kann noch mehr Dinge tun und so blockieren, aber vielleicht auch nicht, erstmal hier an runApplet() arbeiten

schreibe auch ans Ende der Methode runApplet() 
> System.out.println("Ende runApplet, jetzt kann man bald was sehen");
bevor diese Meldung nicht kommt siehst du nix

------

> in der Methode runUpload starte ich einen Thread der dann den Upload tätigt,

richtig:

> // Startet den Thread mit der eigentlichen Upload-Logik.
>        thread.start();


doch wie ich jetzt sehe steht direkt dahinter

>        // Wartet bis der Thread seine Aufgaben erledigt hat.
>            thread.join();


tja, so gehts nicht, so bringt der Thread wenig, die aktuelle Methode wird weiter aufgehalten, das Ende der Methode ist nicht in Sicht,
wozu das warten? nimm es raus, dann klappt es vielleicht schon


----------



## Sued_Faust (2. Aug 2010)

Das Applet wird aus einer JS-Funktion aufgerufen. Nach dem Aufruf es Applets soll des JS-Code weiter laufen. Wenn ich thread.join nicht drin habe läuft das Applet zwar durch aber der JS-Code paralel auch und das möchte ich nicht.

und wenn ich buildGUI in einen eigen Thread schiebe macht das kein unterschied, er zeigt mir da immer noch nichts an.


----------



## Sued_Faust (2. Aug 2010)

Ok es muss irgendwo in der For-schleife in runApplet und dem was du auch schon meintest der Join Methode liegen.
Kannst du mir sonst eine andere Möglichkeit anbieten, dass Applet abzuwarten bis es fertig ist, um dann im JS-Code vortzufahren?


----------



## Sued_Faust (2. Aug 2010)

Keiner ne Idee?


----------



## SlaterB (2. Aug 2010)

wenn es überhaupt jemanden gibt, der was von JavaScript-Aufrufe an Applets weiß,
dann wird der/ die sich gewiss nicht hier in die Swing-Area zum Thema JProgressBar verlaufen

falls du JavaScript-Aufrufe an Applets thematisieren willst, dann in einem neuen entsprechend benannten Thema im richtigen Bereich?,
wobei es schon eine Aufgabe ist, den zu finden,

Applets ist auf der Hauptseite nur unter Deployment genannt, das klingt wenig interessant, 
vielleicht doch hier bei AWT & Swing bleiben, vielleicht nur die aktuelle Themenüberschrift wenigstens um das Stichwort 'Applet' erweitern?


----------



## Sued_Faust (2. Aug 2010)

Also mittlerweile funktionier das erscheinen der GUI nach aufruf der Methode runApplet. Problem dabei ist das es nur funktioniert, wenn ich diese Methode mittels der vom Applet gegebenen start() Methode aufrufe . Das heißt wenn ich es in mein Webseite mit einbaue wird mir die GUI nicht mehr geladen, aber der Upload trotzallem getätigt. Woran kann das denn liegen?

"keiner ne Idee", wollte ich eigentlich nur wissen ob es eine alternative zu Join gibt um ein Thread abzuwarten.


----------

