Portal > Foren > Java > Desktop-Applikationen und Grafik > Fenster schließen abfangen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 07.05.2005, 19:20 Nach oben    #1
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard Fenster schließen abfangen

Wie kann ich denn das schließen eines Fensters abfangen?
Ich möchte nämlich vorher noch kurz den Benutzer fragen ob er wirklich möchte.

Auf mein JFrame lauscht folgender Listener:

PHP-Code:
        this.addWindowListener(new WindowAdapter() {
            public 
void windowClosing(WindowEvent event1) {
                
closeApp();
            }
        }); 
Ich wollte einfach die Methode CloseApp aufrufen, und das tut er auch.
Allerdings, da es sich bei dem JFrame um das Hauptfenster der Anwendung handelt, möchte ich erst nachfrage ob das ganze Programm beendet wird.
Die Abfrage kommt zwar, und er beendet das Programm auch nur wenn ich "Ja" anworte, aber das JFrame macht er auf jeden Fall zu.

In der API steht unter WindowAdpapter und der Methode windowClosing:
windowClosing
Code:
public void windowClosing(WindowEvent e)Invoked when a window is in the process of being closed. The close operation can be overridden at this point. 

Specified by:
windowClosing in interface WindowListener
eigentlich hab ich gedacht wenn ich die Methode überschreibe geht das JFrame gar nicht weg? Tut es aber doch... was tue ich dagegen?

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 19:35 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Wie sieht denn die Methode closeApp() aus?
Dann kann ich das mal bei mir testen.

Grüße Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 19:52 Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Die Methode closeApp:

PHP-Code:
    private void closeApp() {
        
int ende JOptionPane.showConfirmDialog(this"Soll das Programm wirklich beendet werden?""Beenden"JOptionPane.YES_NO_OPTIONJOptionPane.QUESTION_MESSAGE);
        if (
ende == 0) {
            
System.exit(1);
        }
    } 
Es soll also ein Fragedialog aufgerufen werden der frag ob wirklich das Programm beendet werden soll.
Die Methode mit einem ActionListener auf einen Button gelegt funktioniert.

Der Fehler scheint zu sein, dass das klicken des kreuzchens der Applikation (also die vom Betriebssystem zur Verfügung gestellte "Schließen-Schaltfläche" *lol*), trotzdem ein setVisible(False) oder dispose() auf das JFrame auslöst.

Also der Grund warum ich das haben möchte ist einfach: der Benutzer soll bestätigen, dass er das Programm beenden will. Später kommen dann noch ein paar Aufräummaßnahmen in closeApp dazu.

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 19:57 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Du möchtest wahrscheinlich auf dieses Ereignis achten.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 19:59 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Hi,
wenn Du folgende Zeile einfügst, dann klappt es:
PHP-Code:
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
Edit: irgendwie wird da eine Leerstelle angezeigt ... die ist aber natürlich nicht da.

Hier mal mein ganzes Beispiel:
PHP-Code:
import java.awt.event.*;
import javax.swing.*;


public class 
DemoFrameClosing {

    public static 
void main(String[] args) {
        
JFrame frame = new MyFrame("test");

    }
}


class 
MyFrame extends JFrame {
    
    public 
MyFrame(String title) {
        
super(title);
        
this.setSize(500500);
        
this.setVisible(true);
        
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            
        
this.addWindowListener(new WindowAdapter() {
               public 
void windowClosing(WindowEvent event) {
                       
closeApp();
               }
           }
        );    
    }
    
    public 
void closeApp() {
        
int ende JOptionPane.showConfirmDialog(this"Soll das Programm wirklich beendet werden?""Beenden"JOptionPane.YES_NO_OPTIONJOptionPane.QUESTION_MESSAGE);
        if(
ende == 0) {
            
System.exit(1);
        }    
    }

Grüße Ben
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 19:59 Nach oben    #6
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Zitat:
Zitat von TheDragonMaster
Du möchtest wahrscheinlich auf dieses Ereignis achten.
Ich dachte das tue ich?!?

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 20:05 Nach oben    #7
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Zitat:
Zitat von Ben
Hi,
wenn Du folgende Zeile einfügst, dann klappt es:
PHP-Code:
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
Argh... geht.
Wär ich aber wahrscheinlich nie drauf gekommen
Hatte mit damit bisher nur bei InternalFrames zu tun.
Kombinieren ist wohl nicht meine Stärke.

Dangöööööö

Gruß
Sparrow
your Dr. Watson, not Mr. Holmes
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 20:06 Nach oben    #8
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Oh... das kommt davon, wenn man neben dem Arbeiten noch versucht, schlaue Tipps zu geben. *g*
Hab aus irgendwelchen Gründen "windowClosed" gelesen.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.05.2005, 20:07 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Zitat:
Zitat von sparrow
Zitat:
Zitat von Ben
Hi,
wenn Du folgende Zeile einfügst, dann klappt es:
PHP-Code:
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
Argh... geht.
Wär ich aber wahrscheinlich nie drauf gekommen
Ich habs auch nur geraten, getestet und dann habsch mich gefreut

Ist aber ja auch irgendwie tricky.
Naja. Problemchen gelöst ...
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.06.2005, 10:31 Nach oben    #10
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Jou. Ich muss hier gerade mal etwas rauskramen.

Ich habe mir folgende Klasse geschrieben.
PHP-Code:
package net.yebs.logic;


import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class 
ConfirmAppClosing {

    public 
ConfirmAppClosing(JFrame frame) {

        if(
JOptionPane.showConfirmDialog(frame"Soll die Anwendung wirklich beendet werden?""Anwendung beenden"JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
            
frame.setVisible(false);
            
frame.dispose();
            
System.exit(1);
        }      
    }

Da steht jetzt eigentlich nichts drin, allerdings wüsste ich nicht so ganz, wie ich das in eine andere Klasse integrieren könnte.
Passt irgendwie nicht.

Nunja. Ich verwende die Funktionalität momentan hier:
PHP-Code:
public class CloseAppAction extends AbstractAction {

    private 
JFrame frame;
    
    public 
CloseAppAction(JFrame frame) {
        
super("Beenden");
        
this.putValue(Action.ACCELERATOR_KEYKeyStroke.getKeyStroke(KeyEvent.VK_ESCAPEInputEvent.CTRL_MASK));
        
        
this.frame frame;
    }
    
    public 
void actionPerformed(ActionEvent event) {
        
ConfirmAppClosing close = new ConfirmAppClosing(this.frame);
    }


Ich frage also beim Anklicken des Menüeintrags "Beenden" ab, ob die Anwendung wirklich geschlossen werden soll.

Ich möchte jetzt zusätzlich, wie in diesem Thread auch erfragt, darauf reagieren, wenn das Fenster mittels dem X oben rechts geschlossen wird.

Das ist auch eigentlich kein Problem. Ich habe ja selbst die Lösung gepostet, allerdings stellt sich mir hier jetzt gerade eine andere Frage.

Ich nutze hier jetzt ja eine anonyme Klasse. Finde ich an dieser Stelle eigentlich recht passend (wenn ich da falsch denke bitte sagen ).
Ich brauche jetzt aber für den Konstruktor der Klasse ConfirmAppClosing das zu schließende Frame. Im ersten Beispiel nutze ich da "this".
In der anonymen inneren Klasse geht das aber ja nicht ..

Frage:
"Wie komme ich denn da jetzt trickreich an das Frame?"

Danke
Grüße Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.06.2005, 10:53 Nach oben    #11
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Diese "ConfirmAppClosing"-Klasse würde ich wirklich als statische Klasse basteln...
Also sowas in der Art von: ConfirmedFrameCloser.maybeCloseFrame(frame);

Bzgl. anonymer Klassen und "this" - das wird jetzt echt häßlich - gibt es eine Möglichkeit:
Code:
public class MyFrame extends JFrame {
    public MyFrame() {
        // ... das übliche halt
        addWindowDingsda(new WindowAdapter() {
            public void windowDingsda() {
                MyFrame.this.dispose();
            }
        }
    }
}
Auch wenn ich da so manches verhauen habe, wie du an "this" rankommst sollte nun klar sein.

Eine andere alternative wäre es, eine Referenz auf "this" in einer Variable (ich nenne sie gerne "self") zu speichern.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.06.2005, 11:09 Nach oben    #12
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Hallo,
super Idee mit dem "self" ... *ploink*
Bin ich nicht drauf gekommen.

Habe die Klasse bzw. die Methode jetzt mal als static deklariert. Ist eine gute Idee, dann erspare ich mir die Erstellung des Objekts.

Jut. Danke Dir.
Problem gelöst

Grüße Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mit JavaScript prüfen, ob Fenster gewisse Breite unterschreitet Ben JavaScript und AJAX 2 10.09.2007 13:26
Durchsichtiges fenster Xean Desktop-Applikationen und Grafik 7 15.05.2006 15:18
Fenster verschieben - anderes Fenster mit verschieben? Binary Allgemeine Java-Programmierung 2 15.08.2005 10:24
NOOB FRAGE: Fenster bei Buttondruck Muluf Allgemeine Java-Programmierung 2 21.06.2005 15:06
Neues Fenster öffnen bacarni Allgemeine Java-Programmierung 2 10.01.2005 21:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45