JProgressBar und ihre Tücken

Status
Nicht offen für weitere Antworten.
C

Centurio

Gast
Guten Morgen erstmal miteinander,

Zur Erklärung meines Problemes:
Ich habe eine boolean Funktion deren Ausführungszeit etwas länger dauern kann. Genauer gesagt ist dies ein Funktion, die sich auf einen RMI Server verbindet und sich dort anmeldet.
Soweit so gut, ich möchte dieses Verbinden mit einer JProgressBar im Indeterminate Modus visualisieren. Und zwar so, dass ein Dialog mit eben dieser JProgressBar angezeigt wird solange die Funktion nicht zurückgekommen ist. Das Probleme welches ich erfahren habe liegt darin, dass ich für diesen Dialog mit der JProgressBar einen eigenen Thread brauche, da sonst beides hintereinander ausgeführt werden würde (zuerst also der Dialog und dann die Funktion). Jetzt muss ich den Dialog aber nach Rückkehr der Funktion schliessen können, d.h. den Thread irgendwie auch beenden.

ich habe für den Dialog folgenden Ansatz:
Code:
public class VerbindungsDialog extends JDialog implements Runnable {
...
public void run() {
        this.setVisible(true);
    }
...
}

und für die Aufrufende Funktion:

Code:
VerbindungsDialog vDialog;
Thread vDialogThread;


public void doconnect() {
 if (vDialog == null) vDialog = new VerbindungsDialog();
 vDialogThread = new Thread(vDialog);
 vDialogThread.start();
 boolean done = // hier die Lange Funktion mit Rückgabewert boolean.
 vDialog.setVisible(false);
}

Dies funktioniert nur ein mal, nämlich beim Standardmäßigen Startaufruf der Funktion doconnect() aus dem Hauptthread heraus. Beim nächsten Aufruf per Menü von der Oberfläche (eigener Thread), bleibt der Dialog auch offen nachdem die Funktion zurückgekehrt ist.

Meine Frage also, warum ist dies so und wie kann ich einen Dialog schreiben, der das tut was ich möchte.


Mfg Centurio
 

kleiner_held

Top Contributor
Nicht der Dialog muss in einen eigenen Thread sondern die lange Funktion. So wie ich dein Beispiel verstanden habe, blockierst du ja immer noch den GUI-Thread.

Code:
VerbindungsDialog vDialog;

private VerbindungsDialog getVDialog()
{
  return vDialog;
}

public void doconnect() 
{
   if (vDialog == null)
      vDialog = new VerbindungsDialog();
   Thread workerThread = new Thread(new Runnable() {
       public void run() {
          boolean done = // hier die Lange Funktion mit Rückgabewert boolean.
          SwingUtilities.invokeLater(
          new Runnable() {
             public void run() {
                getVDialog().setVisible(false);
          }});
        } 	
    });
    workerThread.start();
    vDialog.setVisible(true);
}
 
C

Centurio

Gast
Danke für die die Antwort, darüber hatte ich auch schon nachgedacht. Das Problem hierbei ist dass ich ja den boolean done zur Weiterverarbeitung wieder ausserhalb des Threads brauche, und mir kein schönes Konstrukt eingefallen ist, mit dem ich diesen wieder bekomme.

Mfg Centurio
 

MasterEvil

Bekanntes Mitglied
ich würde es in etwa so machen:

Code:
    private void foo() {
    	DialogThread th = new DialogThread();    	
    	th.start();
    	// Deine lange Anweisung
    	th.stopNow();
    }
    
    private class DialogThread extends Thread {
		private boolean goon = true;
		private JDialog dialog;
		
		public void run() {
			dialog = new JDialog();
			dialog.setVisible(true);
			while(goon) {
				try { sleep(200); }
				catch (InterruptedException e) { e.printStackTrace(); }
			}
		}
		public void stopNow() {
			goon = false;
			dialog.setVisible(false);
		}
    }
 

kleiner_held

Top Contributor
Wenn dein Diaog mit dem Progressbar modal ist, bleibt die Methode doconnect() nach vDialog.setVisible(true); stehen und geht erst weiter, wenn der Dialog mit setVisible(false); wieder versteckt wurde. Du kannst also eine private Variable boolean result anlegen, die dann von dem, WorkerThread mittels setResult(boolean) gesetzt wird und in doconnect() nach dem setVisible() ausgewertet wird.

PS: Ich sehe gerade, das dein eigentliches Problem (ProgressBar verschwindet nicht) auch darin liegen koennte, dass deine lange Funktion beim zweiten mal doch nicht solange dauert wie gedacht :) Dann koennte passieren dass setVisible(false) vor setVisible(true) aufgerufen wird und der Dialog bleibt ewig sichtbar.
Da muesste man quasi ueber synchronized sicherstellen, dass der Dialog in diesem Fall garnicht erst angezeigt wird.
 

kleiner_held

Top Contributor
@MasterEvil
das gleiche Problem - wenn foo() im AWT Event Thread aufgerufen wird, also zB durch einen ActionListener an einem Button, dann haengt die ganze GUI waehrend die "lange Anweisung" abgearbeitet wird.
D.h. nicht nur keine Eventverarbeitung, sondern vor allem kein Neuzeichnen, falls das Fenster mal ueberdeckt wird.

Ich hab deinen Code mal als Beispiel ausgebaut um das zu veranschaulichen:

Code:
public class DialogTest
{	
	public static void main(String[] args)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.getContentPane().add(new JButton(new AbstractAction("Test") {
			public void actionPerformed(ActionEvent e)
			{
				foo();
			}
		}));
		frame.pack();
		frame.setVisible(true);
	}
	
	private static void foo() {
		DialogThread th = new DialogThread();       
		th.start();
		// simulierte lange Anweisung
		try 
		{ 
			Thread.currentThread().sleep(10000); 
		}
		catch (InterruptedException e) { e.printStackTrace(); }
		th.stopNow();
	}

	private static class DialogThread extends Thread {
		private boolean goon = true;
		private JDialog dialog;

		public void run() {
			dialog = new JDialog();
			dialog.getContentPane().add(new JButton("Test"));
			dialog.pack();
			dialog.setVisible(true);
			while(goon) {
				try { sleep(200); }
				catch (InterruptedException e) { e.printStackTrace(); }
			}
		}
		public void stopNow() {
			goon = false;
			dialog.setVisible(false);
		}
 }
}
 

kleiner_held

Top Contributor
vielleicht noch mal ein Beispiel wie ich sowas angehen wuerde:
Code:
public class DialogTest
{
	
	public static void main(String[] args)
	{
		final JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.getContentPane().add(new JButton(new AbstractAction("Test") {
			public void actionPerformed(ActionEvent e)
			{
				System.out.println(new SampleWorker(frame).doconnect());
			}
		}));
		frame.pack();
		frame.setVisible(true);
	}

	private static class SampleWorker
	{
		JDialog vDialog;
		private boolean result;
		
		public SampleWorker (JFrame frame)
		{
			vDialog = new JDialog(frame, "5 Sekunden warten", true);
			JProgressBar bar = new JProgressBar();
			bar.setIndeterminate(true);
			vDialog.getContentPane().add(bar);
			vDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
			vDialog.pack();
		}
		
		private void finish()
		{
			vDialog.setVisible(false);
		}
		
		public boolean doconnect()
		{
		   Thread workerThread = new Thread(new Runnable() {
		       public void run() {
		    	   // hier die Lange Funktion mit Rückgabewert boolean.
		           boolean done = true;
		           try
		           {
		              Thread.currentThread().sleep(5000);
		           }
		           catch (InterruptedException e) { e.printStackTrace(); }
		           result = done;
		           SwingUtilities.invokeLater(
		        		   new Runnable() {
		        			   public void run() {
		        				   finish();
		        			   }});
		        }    
		    });
		    workerThread.start();
		    vDialog.setVisible(true);
		    return result;
		} 
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
Z kleine JButtons und ihre Beschriftung AWT, Swing, JavaFX & SWT 5
N Die Zeile einer JTable verändert beim klicken ihre Farbe? AWT, Swing, JavaFX & SWT 7
M jTree und seine Tücken AWT, Swing, JavaFX & SWT 6
D GridBaglayout und seine Tücken. AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen


Oben