Probleme mit Schließen von modalen JDialogs

aline_bohrer

Grünschnabel
Hallo,

ich habe ein Problem mit dem Schließen von modalen JDialogs, die ich aus meiner Anwendung über Buttons aufrufe.

Beim Schließen der Dialoge über Abbrechen oder X, wird der Dialog geschlossen, aber im ActionListener die Funktion, die den Dialog aufgerufen hat nocheinmal ausgeführt. Sprich: Der Dialog erscheint zum zweiten Mal. Dieser lässt sich dann aber problemlos schließen.

Im ActionListener wird allerdings nicht wieder actionPerformed(), sondern wirklich nur die Funktion, die bei Klick auf den Button ausgelöst wird, ausgeführt.

Bei nicht modalen Dialogen funktioniert alles problemlos.

Hab im Netz schon gesucht, das Problem ist wohl auch bekannt. Leider passten die angebotenen Lösungen (z. B. zweimaliger show()- Aufruf) nicht bei mir.

Ich hoffe ihr könnt mir irgendwie weiterhelfen! ;-)

Schon mal vielen Dank,

gruß aline
 
Hallo,

poste mal bitte den Quelltext von dem Dialog und den Aufruf in dem Hauptprogramm.
 
Hallo zerix,

erst mal danke für das schnelle Reagieren.
Wie Du erkennst, hab ich das noch nicht oft gemacht und kein Plan wie das mit der Formatierung des Quellcodes geht...hoffe du kannst trotzdem was mit anfangen!

Wir haben uns soweit möglich an das MVC-Konzept gehalten, deshalb hab ich einige Schritte weggelassen.
Hoffe ich hab soweit alles nochmal in den Urzustand versetzt, da ich mir im Moment mit dem Deaktivieren des Haufptfensters und dem Aufruf von nicht modalen Dialogen geholfen habe.

Der Aufruf im Hauptprogramm:

chgmasschoice = new WeightDialog(window, "Chargenauswahl",true);
chgmasschoice.pack();
chgmasschoice.setVisible(true);

Der Code vom Dialog:

public class WeightDialog extends JDialog
{
//Variablendeklaration
/**
* Standardkonstruktor
*/
public WeightDialog()
{
}

/**
* Konstruktor
* @param View v Parent
* @param String s Titel
* @param Boolean b Modalitätskennzeichen
*/
public WeightDialog(View v, String s, boolean b)
{
super(v);
this.setTitle(s);
this.setModal(true);
this.window = v;
this.listener = window.getListener();
this.init();

}

public void init()
{
try
{
//Listener
this.addWindowListener(window.getWlistener());
this.addKeyListener(window.getKlistener());

//Buttonpane
buttonpane = new JPanel();
buttonpane.setLayout(new FlowLayout(FlowLayout.CENTER));
option1 = new JButton();
option1.addActionListener(listener);
buttonpane.add(option1);
option2 = new JButton();
option2.addActionListener(listener);
buttonpane.add(option2);
option3 = new JButton();
option3.addActionListener(listener);
buttonpane.add(option3);

//Statusleiste
statuspane = new JPanel();
statuspane.setLayout(new FlowLayout(FlowLayout.CENTER));
status = new JLabel("Copyright: ");
status.setForeground(Color.WHITE);
status.setFont(new Font("Arial", Font.ITALIC, 10));
statuspane.add(status);

//helppane
help = new JPanel();
gbl = new GridBagLayout();
gbc = new GridBagConstraints();
help.setLayout(gbl);
gbc.insets = new Insets(30,20,10,20);
gbc.gridwidth = GridBagConstraints.REMAINDER;


//Scroll
scroll = new JScrollPane();
scroll.setViewportView(help);
scroll.setBorder(BorderFactory.createEmptyBorder());

//Layout
getContentPane().setLayout(new BorderLayout());
getContentPane().add("Center", scroll);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
catch(Exception ex)
{
logger.error("1003: Der JDialog für die Quasiartikelbilanzierung konnte nicht erstellt werden: " + ex.getMessage());
}

}//close init

Danke,

gruß aline
 
Window ist das Hauptfenster, in dem auch alle Listener und Controlklassen erzeugt werden. Damit ich keine Probleme mit doppelt erzeugten Listenern bekomme, erzeuge ich mir alle Listener zentral im Hauptfenster und hole sie mir für die einzelnen Objekte von dort.
Noch einige Anmerkungen (habs jetzt wieder komplett rekonstruiert) :
Beim Dialog ist die DefaultCloseOperation natürlich DO_NOTHING_ON_CLOSE.
Außerdem passiert der zweite Aufruf nur, wenn ich den Dialog über X schließe, bei Abbrechen nicht. Obwohl bei beiden die gleiche Funktion aufgerufen wird:

public void ChargeSelectionAbbrechen()
{
//Chargenauswahl schließen
logger.debug("bin in charge selection abbrechen");
chgchoice.setVisible(false);
chgchoice.dispose();

}

Das ist die logger-Ausgabe bei dem Schließen über den Button:
2005-06-07 09:40:02,937 DEBUG [ActionsListener.java:77] - das label: HandeinwaageAbbrechen
2005-06-07 09:40:02,937 DEBUG [ControlWeight.java:869] - Handeinwaage Abbruch
2005-06-07 09:40:02,953 DEBUG [ControlWeight.java:869] - Handeinwaage Abbruch
2005-06-07 09:40:02,953 DEBUG [ControlWeight.java:869] - Handeinwaage Abbruch

...und das kommt beim Schließen übers X:
2005-06-07 09:44:29,171 DEBUG [WindowListener.java:70] - Name: Chgmasschoice
2005-06-07 09:44:29,171 DEBUG [ControlWeight.java:869] - Handeinwaage Abbruch
...und dann gleich nochmal der Neuaufruf.


gruß aline
 
Das bringt auch nichts.

Vielleicht ist die Information, dass ich weitere modale Dialoge aus modalen Dialogen heraus aufrufe, noch wichtig.
Je mehr Dialoge ich hintereinander aufrufe, desto öfter muss man sie schließen, bis sie ganz verschwinden.
 
Zurück