Automatisches schliessen eines Dialogs

Status
Nicht offen für weitere Antworten.

Kaladial

Bekanntes Mitglied
moin

also ich hab da nen problem und ma nen kleines programm geschireben was das verdeutlichen soll...
unten also der quellcode...

beschreibung meines problems:

also ich starte eine komunikation mit einer com-schnittstelle schick der nen befehl und danach muss ich die com schliesen und mit anderen parametern wieder öffnen ...

nun will ich aber warten bis die com auch geschlossen ist bis ich eine neue aufmachen will

also:

1.) aufmachen
2.) befehl senden
3.) schliessen
4.) warten bis geschlossen ist
5.) neu aufmachen

punkt 1-3 und 5 sind kein problem

nr 4 schon ...

also zu meinem programm:
ich hab ne frunktion die einen thread startet in dem die komunikation mit der com abläuft
und wenn ich nun der com sage schliess dich ´wird zum schluss jeder thead gekillt und danach eine variable stop gesetzt... in meinem restlichen programm soll ein dialog aufgehn wo drin steht: noch in arbeit

und wenn der thread die variable stop auf true setzt soll sich der dialog automatisch schliessen und mein programm soll weiter machen und die richtige komunikation starten ...

was geht bisher:

also com starten und stopen klappen / variable setzten auch kein problem...
dialog aufmachen auch nicht ...

was geht nicht:

dialog schliesen ...


also hier mal der code...
und ich hioffe ich hab mich verständlich ausgedrückt

Code:
package testapp;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.Rectangle;

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;

public class CloseDLG extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	public static CloseDLGThread clt;  //  @jve:decl-index=0:
	private JButton jButton = null;
	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				CloseDLG thisClass = new CloseDLG();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public CloseDLG() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(600, 400);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
		
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJButton(), null);

		}

		return jContentPane;
	}
	
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("go");
			jButton.setBounds(new Rectangle(150, 50, 150, 20));
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					clt = new CloseDLGThread();
					clt.start();
					go();
				}
			});
		}
		return jButton;
	}

	public void go(){
		CloseDLGDialog dlg = new CloseDLGDialog(this, "Starte Com-Port-Verbindung"); 
		dlg.setTitle("Starte Com-Port-Verbindung");
		dlg.setModal(true);
		dlg.setVisible(true);
	}
}

Code:
package testapp;

public class CloseDLGThread extends Thread {
	boolean running=false;
	public boolean stop=false;
	
	public CloseDLGThread() {
	}

	public void stopThread(){
		running=false;
	}
	
	public void run() { 
		try { 
			while (true) {
				while (running) {
					try {
						sleep(10000L);
						stop=true;
					} catch (Exception e){}
				} 
			}
		} catch (Exception e){System.out.println("MT1:"+e);}
	}

}

Code:
package testapp;

import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Frame;
import java.awt.BorderLayout;
import java.awt.Rectangle;

import javax.swing.JDialog;

public class CloseDLGDialog extends JDialog {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JLabel jLabelMeldung = null;
	String meldung="";

	/**
	 * @param owner
	 */
	public CloseDLGDialog(Frame owner, String meldung) {
		super(owner);
		this.meldung=meldung;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		jLabelMeldung.setText(""+meldung);
		close();
	}

	public void close(){
		System.out.println("closeDLG:"+CloseDLG.clt.stop);
		
		//warten bis CloseDLG.clt.stop = true und dann schliesen		
		
		System.out.println("closeDLG2");
		this.setVisible(false);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabelMeldung = new JLabel();
			jLabelMeldung.setText(""+meldung);
			jLabelMeldung.setHorizontalAlignment(JLabel.CENTER);
			jLabelMeldung.setBounds(new Rectangle(20, 30, 200, 20));
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(jLabelMeldung, null);
		}
		return jContentPane;
	}

}

thx für hilfe
mfg Kala
 

Kaladial

Bekanntes Mitglied
hmmm gelesen hab ich es aber nicht so richtig verstanden .. hmm können wir das net ma an meinem beispiel durchgehn ?

weil ich hab nich so richtig die idee wo ich nun ansetzten soll
 

André Uhres

Top Contributor
Erstmal folgendes Beispiel mit wait und notify:
Der CloseDLGThread sendet andauernd im 10 Sekunden Takt notify Anweisungen.
Wenn der CloseDLGDialog dann grad sichtbar ist, wird er geschlossen.

Dazu benötigen wird zunächst ein Objekt, das den Lock darstellt:
Code:
public class CloseDLG extends JFrame {
    protected static final String closeLock = "closeLock";
Da wir hier einen ewigen Thread haben wollen, testen wir bei jeder User Action,
ob er schon besteht und initialisieren die Bedingungsvariable der Synchronisation (stop=false):
Code:
               public void actionPerformed(java.awt.event.ActionEvent e) {
                    if (clt == null || !clt.isAlive()) {
                        clt = new CloseDLGThread();
                        clt.start();
                    }
                    synchronized(closeLock){
                        clt.stop = false;
                    }
                    go();
                }
Beim Dialog benutzen wir auch immer dieselbe Instanz und rufen seine close() Methode auf,
ehe wir ihn sichtbar machen:
Code:
   private CloseDLGDialog dlg;
...
    public void go() {
        if (dlg == null) {
            dlg = new CloseDLGDialog(this, "Starte Com-Port-Verbindung");
            dlg.setTitle("Starte Com-Port-Verbindung");
            dlg.setModal(true);
        }
        dlg.close();
        dlg.setVisible(true);
    }
Da unser CloseDLGThread ewig läuft, setzen wird "running" entsprechend auf true:
Code:
public class CloseDLGThread extends Thread {
    boolean running = true;
In der run() Methode von CloseDLGThread synchronisieren wir auf "closeLock",
setzen die Bedingungsvariable (stop=true) und senden den notify:
Code:
               while (running) {
                    try {
                        sleep(10000L);
                        synchronized(CloseDLG.closeLock){
                            stop = true;
                            System.out.println("notify");
                            CloseDLG.closeLock.notify();
                        }
                    } catch (Exception e) {
                    }
                }
Da wir wir vom CloseDLGDialog immer ein und dieselbe Instanz verwenden,
rufen wir die Methode close() nicht im Konstruktor auf:
Code:
  private void initialize() {
      this.setSize(300, 200);
      this.setContentPane(getJContentPane());
      jLabelMeldung.setText(""+meldung);
      //close();//<---------------------------
   }
Die close() Methode startet jeweils einen neuen Thread, der auf "closeLock" synchronisiert wird
und den CloseDLGDialog schliesst sobald "closeLock" freigegeben wurde und die Bedingung stimmt (stop):
Code:
    public void close() {
        //warten bis CloseDLG.clt.stop = true und dann schliesen      
        new Thread(new Runnable() {

            public void run() {
                synchronized (CloseDLG.closeLock) {
                    while (!CloseDLG.clt.stop) {
                        try {
                            System.out.println("wait");
                            CloseDLG.closeLock.wait();
                        } catch (InterruptedException ex) {
                        }
                    }
                    CloseDLGDialog.this.setVisible(false);
                }
            }
        }).start();
    }

Ich hoffe, das hilft dir ein wenig weiter.


Bemerkung: Damit wir im Fall von manuellem Schliessen nicht unnötig Threads erzeugen,
könnten wir z.B. zu Beginn der close() Methode zusätzlich noch prüfen, ob schon einer läuft:
Code:
   private Thread closeThread;
...
    public void close() {
        if(closeThread != null && closeThread.isAlive()){
            return;
        }
        //warten bis CloseDLG.clt.stop = true und dann schliesen     
        closeThread = new Thread(new Runnable() {
...
        });
        closeThread.start();
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
M JavaFX Automatisches Aktualisieren der Seite AWT, Swing, JavaFX & SWT 26
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
Thallius Automatisches Scrollen zum aktiven JTextView klappt nicht AWT, Swing, JavaFX & SWT 2
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
K Swing Automatisches "Packen" beim "Neu-Painten" AWT, Swing, JavaFX & SWT 2
V automatisches neuzeichnen verhindern AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
P Automatisches Mitscrollen der ScrollPane AWT, Swing, JavaFX & SWT 2
S Automatisches Rendern einen JPanels AWT, Swing, JavaFX & SWT 8
G Weiches automatisches verschieben eines JSplitPane-Dividers? AWT, Swing, JavaFX & SWT 3
V Automatisches Scrollen bei JScrollPane AWT, Swing, JavaFX & SWT 10
S Automatisches Scrollen in einer JTextArea AWT, Swing, JavaFX & SWT 6
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
T Anwendung mit X schliessen AWT, Swing, JavaFX & SWT 1
F JavaFX Serialport schliessen AWT, Swing, JavaFX & SWT 3
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
F Swing Auf Knopfdruck ein Fenster schliessen AWT, Swing, JavaFX & SWT 12
D Aktuelles Fenster schliessen AWT, Swing, JavaFX & SWT 12
N Ereignis beim Schliessen eines Dialoges AWT, Swing, JavaFX & SWT 4
F getrennte formulare schliessen gleichzeitig AWT, Swing, JavaFX & SWT 7
V Alle offenen jDialoge schliessen AWT, Swing, JavaFX & SWT 3
K frame schliessen AWT, Swing, JavaFX & SWT 7
F JDialog per Button schliessen - klappt nicht AWT, Swing, JavaFX & SWT 4
R Fenster schliessen AWT, Swing, JavaFX & SWT 8
S Swing Fenster schliessen, javaw noch im Speicher AWT, Swing, JavaFX & SWT 5
P JTree Knoten schliessen AWT, Swing, JavaFX & SWT 16
S JDialog gibt keine Nachrichten ueber sein Schliessen..? AWT, Swing, JavaFX & SWT 3
S Iphone Style Schliessen AWT, Swing, JavaFX & SWT 3
V JTable verliert Fokus, wie offene Zelle schliessen? AWT, Swing, JavaFX & SWT 5
H Netbeans-Anwendung schliessen AWT, Swing, JavaFX & SWT 8
F Fenster schliessen AWT, Swing, JavaFX & SWT 17
J WindowEvents beim Schliessen eines Fensters AWT, Swing, JavaFX & SWT 5
W Beim Schliessen Aktion ausführen AWT, Swing, JavaFX & SWT 2
D 2 verschiedene Frames mit einem Button schliessen AWT, Swing, JavaFX & SWT 2
P Mit Cancel Button ein JPanel schliessen AWT, Swing, JavaFX & SWT 12
A JFrame: Abfrage ob schliessen oder nicht? AWT, Swing, JavaFX & SWT 8
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
E JDialog auf Knopfdruck schliessen AWT, Swing, JavaFX & SWT 2
E Will nur fenster schliessen AWT, Swing, JavaFX & SWT 2
S JDialog schliessen und es mitbekommen AWT, Swing, JavaFX & SWT 5
U Anwendung nicht beenden beim form schliessen? AWT, Swing, JavaFX & SWT 6
G JDialog schliessen AWT, Swing, JavaFX & SWT 5
S JDialog und 'Inhalte' schliessen bzw. leeren AWT, Swing, JavaFX & SWT 9
Y Problem mit JFrame und Panel (Schliessen eines JFrame) AWT, Swing, JavaFX & SWT 8
B MouseListener & Fenster schliessen AWT, Swing, JavaFX & SWT 3
lin modaler JDialog mit #dispose() schliessen ? AWT, Swing, JavaFX & SWT 4
D JDialog muss man immer öfters schliessen AWT, Swing, JavaFX & SWT 3
L JWindow schliessen AWT, Swing, JavaFX & SWT 4
M JFrame über x schliessen überschreiben funktioniert nicht! AWT, Swing, JavaFX & SWT 7
R Eingabeaufforderungs-Fenster beim start schliessen - wie? AWT, Swing, JavaFX & SWT 6
G JDialog schliessen deaktivieren AWT, Swing, JavaFX & SWT 7
D JFrame Fenster schliessen, zerstören . AWT, Swing, JavaFX & SWT 4
F JFrame über Button schliessen AWT, Swing, JavaFX & SWT 10
G Fenster ohne "verkleinern","Schliessen", AWT, Swing, JavaFX & SWT 4
M frame lässt sich nicht schliessen AWT, Swing, JavaFX & SWT 7
L Fenster Schliessen AWT, Swing, JavaFX & SWT 8
bernd Fenster ohne x zum schliessen anzeigen! AWT, Swing, JavaFX & SWT 14
G Aktion beim Öffnen und Schliessen eines JInternalFrames AWT, Swing, JavaFX & SWT 4
B JFrame schliessen? AWT, Swing, JavaFX & SWT 2
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben