Swing Frage zu modalem JDialog.

nohfreak

Mitglied
Moin Leute,

ich habe gerade ein kleines Problem mit einem JDialog. Ich möchte im Prinzip einen modalen Dialog erzeugen, warten bis eine Operation fertig ist, und dann den Dialog wieder zu machen. In der Zeit soll der parent-Frame gesperrt werden, also hab ich den Dialog modal gemacht.

Problem ist nur, dass die weitere Ausführung dann nicht mehr stattfindet, nachdem ich den Dialog sichtbar geschaltet habe, sprich die Operation, das warten auf deren Ende und dann das schließen des Dialogs.

Kennt da jemand nen Trick, wie man das dennoch hinkriegen kann ?

Gruß,
nohfreak
 
S

SlaterB

Gast
> dass die weitere Ausführung dann nicht mehr stattfindet

der restliche Code wird nie ausgeführt? so gehts ja nun nicht, Code kann doch nicht ignoriert werden, da muss ein Fehler vorliegen, siehe erste Antwort

der restliche Code wird verzögert bis zum Ende des Dialogs? normalerweise möchte man das doch so, ist ein Feature,
ansonsten mit Threads arbeiten, wenn der Dialog in eigenem Thread gestartet wird, wird auch nur dieser unterbrochen, sonstiger Code läuft weiter,
oder den sonstigen Code in einen Thread und VOR dem Dialog starten
 

Ebenius

Top Contributor
Der Aufruf von [c]setVisible(true)[/c] (respektive [c]show()[/c]) kehrt erst zurück, wenn der modale Dialog geschlossen wird. Wenn man nebenher eine Arbeit erledigen muss, dann muss man, wie SlaterB schrieb, mit Threads arbeiten. Am besten benutzt man dafür die SwingWorker-Klasse.

In der API-Doc von SwingWorker.get() findet sich ein gutes Beispiel, wie ein modaler Dialog mit einem SwingWorker verbunden werden kann.

Ebenius
 

nohfreak

Mitglied
Jau, genau das was Ebenius da als Beispiel anführt habe ich gebraucht. Vielen Dank.

Ich wollte euch nicht meinen ganzen Code-Batzen zumuten, da der derzeit doch noch ziemlich wirr ist. Das nächste Mal werf ich ihn dann einfach dazu.

Danke an alle, die probiert haben mir zu helfen.
 

nohfreak

Mitglied
Habe probiert das Ganze mal bei mir einzubauen, aber irgendwie klappt das noch nicht so recht, und mir ist gerade nicht ganz so klar wieso. Diesmal mit Code:

Java:
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.concurrent.ExecutionException;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public abstract class ProgressWorker extends SwingWorker<String, Object> {
	
	private final JProgressBar progressBar = new JProgressBar();
	private JDialog dialog;
	
	public ProgressWorker(JFrame parent, String title, String msg){
		
		dialog = new JDialog(parent, true);
		
		progressBar.setIndeterminate(true);
		
		JLabel msgLabel = new JLabel(msg);
		
		dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		
		dialog.setTitle(title);
		dialog.setLayout(new BorderLayout());
		
		dialog.add(msgLabel, BorderLayout.CENTER);
		dialog.add(progressBar, BorderLayout.SOUTH);
		
		dialog.setLocationRelativeTo(parent);
		
		dialog.pack();
		
		this.addPropertyChangeListener(new PropertyChangeListener(){
	     public void propertyChange(PropertyChangeEvent event) {
	         if ("state".equals(event.getPropertyName())
	                 && SwingWorker.StateValue.DONE == event.getNewValue()) {
	             dialog.setVisible(false);
	             dialog.dispose();
	         }
	     }});

		
	}
	
	// Progressbar anwerfen und execute starten
	public void doWork(){
		dialog.setVisible(true);
		this.execute();
	}
	
}

Und noch die Klasse zum Testen der ganzen Geschichte:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Arrays;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		JFrame frm = new JFrame("Test");
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frm.setSize(new Dimension(800, 600));
		
		frm.setVisible(true);
		
		ProgressWorker t = new ProgressWorker(frm, "Laden,....", "Lange Dateioperation läuft,..."){
			
			public String doInBackground(){
				
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				return "boa";
			}
			
		};
		
		t.doWork();

	}

}

Was ich eigentlich bauen möchte ist eine Klasse, die eine ProgressBar rattern lässt in einem modalen Dialog, nebenbei eine Aktion ausführt, und wenn die Aktion fertig ist den Dialog unauffällig verschwinden lässt.

Problem ist, der Listener scheint nicht zufunktionieren, da der Dialog ja nach einer Sekunde verschwinden sollte, er aber leider die ganze Zeit dableibt. :/

Wär super, wenn mir noch ein barhmerziger Mensch das letzte Brett vorm Kopf abmachen könnte. *gg*
 

nohfreak

Mitglied
*Runtergefallenes Brett mit dem Fuß wegkick*

Super, ich danke dir vielmals, klappt nun astrein. Wie doof von mir. Eigentlich weiß ich das ja. Eigentlich,.... Hehe. Jaja, wenn man intensiv sowas lange genug anstarrt findet man solche kleinen, aber feinen und äußerst dämlichen Fehler nicht mehr. :>
 

nohfreak

Mitglied
Heute habe ich die done()-Methode vom SwingWorker entdeckt. Funktioniert auch super, das einfach dort hineinzupacken. Oder ist bringt das irgendeinen Nachteil mit sich, oder ist design-technisch schlecht ?

EDIT: Es hat sich noch ein ganz anderes Problem ergeben. In der Methode doWork() geht es nach dem setVisible(true) nie weiter, auch wenn der Dialog schon disposed worden ist. Das hat zur Folge, dass es im Test Programm nach dem doWork()-Aufruf auch niemals weitergeht, und ich versteh ehrlichgesagt nicht warum. Wie kann ich das beheben ? Hier nochmal der jetztige Code:

Der Worker:
Java:
import java.awt.BorderLayout;
import java.awt.Window;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.concurrent.ExecutionException;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public abstract class ProgressWorker<T, O> extends SwingWorker {
	
	private ProgressDialog dialog;
	
	public ProgressWorker(JFrame parent, String title, String msg, boolean indeterminateProgressBar){
		
		dialog = new ProgressDialog(parent, title, msg, true, true);
		
	}
	
	/**
	 * Ausführung beginnen und Dialog sichtbar machen.
	 *
	 */
	public void doWork(){
		this.execute();
		dialog.setVisible(true);
	}
	
	/**
	 * Dialog wegmachen, wenn fertig mit der Arbeit.
	 */
	public void done(){
		dialog.setVisible(false);
		dialog.dispose();
	}

	
}

Der Dialog:
Java:
import java.awt.BorderLayout;
import java.awt.Frame;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;

/**
 * The Class ProgressDialog.
 * 
 * @author nils
 */
public class ProgressDialog extends JDialog {
	
	/** The msg label. */
	private JLabel msgLabel;
	
	/** The progress bar. */
	private JProgressBar progressBar;

	/**
	 * The Constructor.
	 * 
	 * @param parent Parentframe
	 * @param title Title
	 * @param msg the Nachricht, die über der ProgressBar stehen soll
	 * @param modal Ist der Dialog modal ?
	 * @param indeterminateProgress Ist die Progressbar Indeterminate ?
	 */
	public ProgressDialog(	Frame parent,
						    String title, 
						    String msg,
							boolean modal, 
							boolean indeterminateProgress ) {
		
		super(parent, modal);
		
		msgLabel = new JLabel(msg);
		JProgressBar progressBar = new JProgressBar(0, 100);
		progressBar.setIndeterminate(indeterminateProgress);
		
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		this.setTitle(title);
		this.setLayout(new BorderLayout());
		
		this.add(msgLabel, BorderLayout.CENTER);
		this.add(progressBar, BorderLayout.SOUTH);
		
		this.setLocationRelativeTo(parent);
		
		this.pack();
	}
}

Der Test:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Arrays;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		JFrame frm = new JFrame("Test");
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frm.setSize(new Dimension(800, 600));
		
		frm.setVisible(true);
		
		ProgressWorker t = new ProgressWorker(frm, "Laden,....", "Lange Dateioperation läuft,...", true){
			
			public String doInBackground(){
				
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				// Tja, die Methode erwartet leider, dass man irgendwas zurückgibt. :-)
				// Kann man scheinbar nicht abstellen, aber man kann nunmal nicht alles
				// haben, ne ?
				return "boa";
			}
			
		};
		
		t.doWork();

                // hier kommts quasi niemals an
		System.out.println("Finished");

	}

Also das "Finished" kommt leider niemals an. :/
 
Zuletzt bearbeitet:

nohfreak

Mitglied
Okay, habe nun eine eine funktionierende Lösung anscheinend ist das dispose() schuld gewesen. Es ergibt für mich zwar keinen Sinn, aber wenn ich das dispose() weglasse funktioniert es. Hat da dennoch jemand eine Erklärung dafür ? Ich find das irgendwie unschön, wenn ich den Dialog nur unsichtbar mache gammelt der ja immernoch im Speicher rum, wenn ich mich nicht irre, oder ?
 

nohfreak

Mitglied
Okay, aber ich dachte das betrifft dann nur diejenigen von dem Objekt, an dem ich dispose aufrufe. Inwiefern erklärt das, warum es an der problematischen Stelle oben nicht weitergeht ?
 

Ebenius

Top Contributor
Was passiert, wenn Du die GUI auf dem EDT erzeugst (das sollte man ohnehin immer machen)?
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Arrays;
 
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
 
public class Test {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
            createAndShowGUI();
          }
        });
    }

    private static void createAndShowGUI() {
        JFrame frm = new JFrame("Test");
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setSize(new Dimension(800, 600));
        
        frm.setVisible(true);
        
        ProgressWorker t = new ProgressWorker(frm, "Laden,....", "Lange Dateioperation läuft,...", true){
            
            public String doInBackground(){
                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                // Tja, die Methode erwartet leider, dass man irgendwas zurückgibt. :-)
                // Kann man scheinbar nicht abstellen, aber man kann nunmal nicht alles
                // haben, ne ?
                return "boa";
            }
            
        };
        
        t.doWork();
 
                // hier kommts quasi niemals an
        System.out.println("Finished");
 
    }
Ebenius
 

nohfreak

Mitglied
Ah, super, danke dir Ebenius. So klappt es! Nun dümpelt der Dialog nachdem er seinen Zweck erfüllt hat auch nichtmehr weiter im Speicher herum.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
M Frage nach Swing Element AWT, Swing, JavaFX & SWT 3
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
T AWT Frage zu AWT AWT, Swing, JavaFX & SWT 5
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
T LookAndFeel Look and Feel Frage AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
G Frage zu processMouseEvent AWT, Swing, JavaFX & SWT 6
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
D Swing implementierungs-technische Frage zu JList/AbstractListModel AWT, Swing, JavaFX & SWT 7
C Event Frage AWT, Swing, JavaFX & SWT 7
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
F Frage zu WindowListeners AWT, Swing, JavaFX & SWT 2
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
C Frage zu ActionListenern AWT, Swing, JavaFX & SWT 7
D Frage @ someActionEvent.getActionCommand() AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben