Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu 'windowClosing(WindowEvent e)' | Schließen bei Druck auf x "vermeiden"



maceop
11-10-2002, 14:56
Hallo,
ich hatte vor kurzem einmal das Problem mit sich nicht schließenden Fenstern. ich wurde dann allerdings schnell darauf hingewiesen das man einen WindowListener benötigt, und dort u.a. die Methode 'public void windowClosing(WindowEvent e)' , bisher habe ich lediglich System.exit(0) in dem 'Block' ausgeführt , so das mein WindowListener so aussah :



class MyWindowAdapter extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);

}
}


so weit so gut, nun habe ich allerdings noch ein JOptionPane eingefügt, das "aufgerufen" / angezeigt wird um nachzufragen ob er wirklich das Programm beenden möchte. Der Dialog wird auch angezeigt und bei der Überprüfung ob YES ausgewählt wurde , wird ordnungsgemäß geschlossen, drücke ich allerdings auf (Dialog) Schließen oder auf NO , dann wird das Fenster ebenfalls geschlossen , nur das Programm schein "weiterzulaufen".
Wie kann ich in solchen Fällen vermeiden, dass das Fenster wirklich geschlossen wird ? liegt das daran das eine windowClosing Methode eingerichtet wurde und er deswegen "automatisch" schließt ?

hoffe ihr versteht das problem. es soll also möglich sein auf X zu drücken, der User hat sich vielleicht verdrückt und wählt im Dialog NO aus, daraufhin soll das fenster nicht geschlossen werden und er kehrt zum prog zurück (zusammgefasst)

tia
maceop

anda_skoa
11-10-2002, 15:24
Probier im Code Block von NO e.consume() zu benutzen.
Vielleicht hilft das.

Ciao,
_

maceop
11-10-2002, 17:09
hi ,

danke , aber ich bekomm folgende meldung:

consume() has protected access in java.awt.AWTEvent

trotzdem danke für die antwort !

mfg
maceop

anda_skoa
11-10-2002, 17:15
Ah, Mist, hab ich übersehen :(

Ansich sollte laut Doku das Fenster nicht geschlossen werden, wenn es im WindowListener nicht explizit mit hide() oder dispose() dazu veranlaßt wird.
Mein Verdacht war, dass das Event dann vielleicht noch woanders behandelt wird.

Probier vielleicht noch das:

super.windowClosing(e);

Ciao,
_

maceop
11-10-2002, 17:22
bei dir geht das ja wirklich mehr als nur schnell mit den antworten ;)
vielleicht hab ich was falsch verstanden, aber innerhalb windowClosing siehts jetzt so aus:



if (n == JOptionPane.YES_OPTION) {
System.exit(0);
} else if (n == JOptionPane.NO_OPTION) {
super.windowClosing(e);
}



hab ich da was falsch verstanden ? so funktionierts zumindest noch nicht

maceop

ps. hab schon ein schlechtes gewissen wegen der ständigen nachfragerei

anda_skoa
11-10-2002, 17:55
Ich hab ein kleines Testprogramm gemacht.
Bei mir geht es wie erwartet, beim vierten Klick macht es exit



import java.awt.*;
import java.awt.event.*;

class MyAdapter extends WindowAdapter
{
protected int count = 0;

public void windowClosing(WindowEvent e)
{
System.err.println("Window closing");
count++;
if (count > 3)
System.exit(0);
}
}

public class EventTest extends Frame
{
public EventTest()
{
super();
addWindowListener(new MyAdapter());
}


static void main(String[] args)
{
EventTest et = new EventTest();
et.show();
}
}


Schau mal ob es bei dir geht und wenn ja, wass passiert, wenn du es mit der JOptionPane machst.

Ciao,
_

maceop
12-10-2002, 12:42
hab jetzt mal "deinen" EventTester genommen und dort die JOPtionPane Control eingebaut, in dem Fall funktionert auch alles wie erwartet (ka warum das beim anderen Programm nicht funktionierte)



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyAdapter extends WindowAdapter
{
protected int count = 0;
JFrame frame;

public void windowClosing(WindowEvent e)
{
int n = JOptionPane.showConfirmDialog(
frame, "Programm wirklich schließen ?",
"Java",
JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION) {
System.exit(0);
} else if (n == JOptionPane.NO_OPTION) {
; //User waehlt NO aus
} else {
// User beendete Dialog ohne Bestätigung von YES / NO
;
}
}
}

public class EventTest extends Frame
{
public EventTest()
{
super();

addWindowListener(new MyAdapter());
}

static void main(String[] args)
{
EventTest et = new EventTest();
et.show();
}
}


danke anda_skoa !

maceop

peschmae
16-10-2002, 15:58
n bisschen kürzer wäre wohl

if (JOptionPane.showConfirmDialog(...) == JOptionPane.YES_OPTION)
System.exit(0)

anstelle von

int n = JOptionPane.showConfirmDialog(
frame, "Programm wirklich schließen ?",
"Java",
JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION) {
System.exit(0);
} else if (n == JOptionPane.NO_OPTION) {
; //User waehlt NO aus
} else {
// User beendete Dialog ohne Bestätigung von YES / NO
;
}

bzw. ein switch() wenn du zwischen den drei unterscheiden willst

oder?

MfG Peschmä

maceop
16-10-2002, 18:37
ja, stimmt schon, ich wollt nur die übersichtlichkeit erhöhen durch diese schreibweise, prinnzipiell hast du recht

maceop