Applikationsfenster schliessen

Status
Nicht offen für weitere Antworten.

zoj

Mitglied
Guten Tag,

wie bringe ich mein Programm dazu, das Fenster zu schliessen, wenn ich auf "Schliessen" klicke?

Die Funktion, die das ausführen soll befindet sich in der Klasse: Schliessen
Komischerweise wird das WindowClosing unterstrichen und als "Add @ Override Annotation" bezeichnet.
Was heißt das?

Hier ist das Quellcode:

Java:
package de.ipartner.java;
import java.awt.Frame;
import java.awt.*;
import java.awt.event.*;


public class MoreEvents extends Frame {

    private Button button1;

    private Button button2;

    private Button button3;

    private Panel buttonPanel;

    private Label meinLabel;

    MoreEvents() {
        super();

        setLayout(new GridLayout(2, 0));

        meinLabel = new Label("Klicke auf einen der Knöpfe!", Label.CENTER);
        meinLabel.setBackground(new Color(255, 204, 102));
        add(meinLabel);

        buttonPanel = new Panel();
        buttonPanel.setBackground(new Color(255, 153, 51));

        button1 = new Button("Knopf 1");
        buttonPanel.add(button1);

        button2 = new Button("Knopf 2");
        buttonPanel.add(button2);

        button3 = new Button("Knopf 3");
        buttonPanel.add(button3);

        add(buttonPanel);

        // Registrieren des Listeners
        button1.addActionListener(new meinListener());
        button2.addActionListener(new meinListener());
        button3.addActionListener(new meinListener());
    }

    class meinListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
        
            //gibt die Beschriftung des Verursachers aus
            //meinLabel.setText(e.getActionCommand());
            
            if (e.getActionCommand() == button1.getLabel()) {
                meinLabel.setText("Knopf 1 wurde gedrückt");
            }
            if (e.getActionCommand() == button2.getLabel()) {
                meinLabel.setText("Knopf 2 wurde gedrückt");
            }
            if (e.getActionCommand() == button3.getLabel()) {
                meinLabel.setText("Knopf 3 wurde gedrückt");
            }
        }

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

    //Hier sitzt irgendwo ein Fehler! Fenster schließt sich nicht
    public static void main(String[] args) {

        MoreEvents fenster = new MoreEvents();
        fenster.pack();
        fenster.setVisible(true);
    }
}
 

ARadauer

Top Contributor
verstehe nicht ganz..
du willst, das wenn man rechts oben aufs X klickt, die Methode des WindowAdapter deine Anwendung schließt?

nach Zeile 45 noch den Listener einfügen und dann klappts

Code:
 addWindowListener(new Schliessen());
 

ARadauer

Top Contributor
schau dir mal diese schreibweise an, könnte dich vielleicht interssieren...

Code:
 addWindowListener(new WindowAdapter(){
           @Override
           public void windowClosing (WindowEvent e){
             System.out.println("close received");
                System.exit(0);
           }
        });

aja Strings verleicht man mit equals...
hat nur zufällig funktioniert, da java intern die Strings cached, bzw weil es in desem fall wirklich genau das selbe String objekt ist... aber generell Strings auf gleichheit mit equals..

Java:
 if (e.getActionCommand().equals(button1.getLabel())) {
 

Dragonfire

Bekanntes Mitglied
Geht das nicht auch mit folgenden Code ?

Java:
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 

=_=_=

Mitglied
HTML:
Geht das nicht auch mit folgenden Code ?
[code=Java]setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);[/code]


Soweit ich weiss ist das mittlerweile auch zum Standard geworden, die "defaultCloseOperation" so zu nutzen.

Z.B. bei sowas:

Java:
  public static void main(String[] args) {

      JFrame frame = new JFrame();
      frame.setBounds(200, 200, 600, 200);
      frame.setTitle("Test");

      Container contentPane = frame.getContentPane();
      contentPane.setLayout(new BorderLayout());
      
      [.....]
      
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
  }
 

Quaxli

Top Contributor
Ja, bei Swing. Der TO bewegt sich aber im AWT-Umfeld, er hat einen Frame, keinen JFrame.
 

zoj

Mitglied
Wow, danke es funktioniert :applaus:

Diese Anweisung erspart eine Menge Arbeit, danke

Java:
        addWindowListener(new WindowAdapter(){
           @Override
           public void windowClosing (WindowEvent e){
             System.out.println("close received");
                System.exit(0);
           }
        });

Könnte man das Gleiche auch mit Buttons machen?

Habe davor mit PHP programmiert und da war es einfacher auf die Buttons zu reagieren.
 

Illuvatar

Top Contributor
Habe davor mit PHP programmiert und da war es einfacher auf die Buttons zu reagieren.

Hihi. Dazu sag ich grade bloß mal: programmier noch ein Weilchen in Java und du wirst so etwas zu schätzen lernen.
Wenn ein Button auf etwas reagieren soll, geht das ganz ähnlich:
Java:
button.addActionListener(new ActionListener(){
           @Override
           public void actionPerformed (ActionEvent e){
              calculateTheMeaningOfLife();
           }
        });

Sowas nennt sich anonyme Klasse. Können sehr nützlich sein - pass aber auf, dass du sie nicht zu viel verwendest. Da kann der Code schnell ziemlich unübersichtlich werden.
 

zoj

Mitglied
Ich komme an einer Stelle wieder nicht weiter.

Habe hier einen kleinen Rechner. Nun wollte ich exceptions erstellen, der bei Falschen Ausgaben entsprechende Meldung ausgibt.

Leider funktioniert meine Exception nicht, der Fehler trotzdem in der JavaConsole ausgegeben.

Hier der Quellcode
Java:
package de.ipartner.java;

public class MiniRechner {
    public static void main(String[] args){
        Hauptfenster fenster = new Hauptfenster();
        fenster.pack();
        fenster.setVisible(true);
    }
}

Java:
package de.ipartner.java;
import java.awt.*;
import java.awt.event.*;

public class Hauptfenster extends Frame {
    //Instanzvariablen
    private Panel eingabePanel, operatorenPanel, ergebnisPanel;
    private TextField zahl1, zahl2;
    private Button plus, minus, multi, divi;
    private Label ergebnis;

    //Konstruktor
    public Hauptfenster(){
        super("Unser kleiner Rechner");

        //Layoutmanager
        this.setLayout(new GridLayout(4,1));

        //Eingabe Panel
        eingabePanel = new Panel();
        eingabePanel.setLayout( new GridLayout(2,1,10,10));

        zahl1 = new TextField("Zahl 1");
        zahl2 = new TextField("Zahl 2");

        eingabePanel.add(zahl1);
        eingabePanel.add(zahl2);

        //Operatoren Panel
        operatorenPanel = new Panel();
        operatorenPanel.setLayout(new FlowLayout());

        plus = new Button("+");
        minus = new Button("-");
        multi = new Button("*");
        divi = new Button("/");

        //Regestrieren des Listeners
        plus.addActionListener( new knopfAktion());
        minus.addActionListener( new knopfAktion());
        multi.addActionListener( new knopfAktion());
        divi.addActionListener( new knopfAktion());


        operatorenPanel.add(plus);
        operatorenPanel.add(minus);
        operatorenPanel.add(multi);
        operatorenPanel.add(divi);

        //Ergebnis Panel
        ergebnisPanel = new Panel();

        ergebnis = new Label("Bitte wählen");

        ergebnisPanel.add(ergebnis);

        //Pannels im Container zusammensetzen
        this.add(eingabePanel);
        this.add(operatorenPanel);
        this.add(ergebnisPanel);

        //EventHandling für Hauptfenster
        this.addWindowListener(new WindowAdapter(){
            //@Override
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });


    }
    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            berechnung(e);
        }
    }

    private void berechnung(ActionEvent e){
        double erg = 0.0;
        
        //Umwandlung der Strings in double
        double z1 = Double.parseDouble(zahl1.getText());
        double z2 = Double.parseDouble(zahl2.getText());

       //Hier will ich den Fehler abfangen
        try{
            //Welcher Knopf wurde gedrückt
            //berechnen
            if(e.getActionCommand().equals(plus.getLabel())){
                //Addition
                erg = z1+z2;
            }
            if(e.getActionCommand().equals(minus.getLabel())){
                //Subtraktion
                erg = z1-z2;
            }
            if(e.getActionCommand().equals(multi.getLabel())){
                //Multiplikation
                erg = z1*z2;
            }
            if(e.getActionCommand().equals(divi.getLabel())){
                //Division
                erg = z1/z2;
            }
            //Ausgabe
            ergebnis.setText("Ergebnis: "+String.valueOf(erg) );

        //Diese Exception funktioniert nicht...
        }catch(java.lang.NumberFormatException f){
                ergebnis.setText("Falsche Eingabe!");
                
                }           
    }
}
 

=_=_=

Mitglied
//Diese Exception funktioniert nicht...
}catch(java.lang.NumberFormatException f){
ergebnis.setText("Falsche Eingabe!");

}


So werden auch keine Exceptions geschrieben.

Eine entsprechende Exception könnte so aussehen:

Java:
try {
    ..........
} catch(NumberFormatException nfe) {
	nfe.printStackTrace();
	System.err.println("Fehler...");
}


Gruss
 
Zuletzt bearbeitet:

=_=_=

Mitglied
Man kann das natürlich noch etwas erweitern:

Java:
try {
	.....
} catch (IOException ioe) {
	ioe.printStackTrace();
	System.err.println("Irgendein Fehler...");
} finally {
	System.out.println("Hier kann noch auf Ereignisse reagiert werden die in jedem Fall verarbeitet werden....");
}
 

diggaa1984

Top Contributor
es dürfte doch keinen Unterschied machen ob er ne Nachricht über SysOut oder auf ner Komponente ausgibt .. ich lehne mich aber mal aus dem Fenster und behaupte das es daran liegt, dass es sich hierbei um ne RuntimeException handelt ... ich glaube gelesen zu haben, dass man diese eben nicht einfach schlucken kann/darf/sollte.
 

zoj

Mitglied
Habe den Code entsprechen geändert. Der Fehler taucht aber auf. ???:L

Die try-catch Konstruktion ist doch richtig. In Zeile 85 fange ich mit try an.

Den Ausdruck java.lang.NumberFormatException habe ich auf NumberFormatException
geändert.

Eigentlich sollte doch der Fehler in der Konsole nicht auftauchen und eine Meldung im Label angezeigt werden.
Da tut sich aber nichts...

Java:
package de.ipartner.java;
import java.awt.*;
import java.awt.event.*;

public class Hauptfenster extends Frame {
    //Instanzvariablen
    private Panel eingabePanel, operatorenPanel, ergebnisPanel;
    private TextField zahl1, zahl2;
    private Button plus, minus, multi, divi;
    private Label ergebnis;

    //Konstruktor
    public Hauptfenster(){
        super("Unser kleiner Rechner");

        //Layoutmanager
        this.setLayout(new GridLayout(4,1));

        //Eingabe Panel
        eingabePanel = new Panel();
        eingabePanel.setLayout( new GridLayout(2,1,10,10));

        zahl1 = new TextField("Zahl 1");
        zahl2 = new TextField("Zahl 2");

        eingabePanel.add(zahl1);
        eingabePanel.add(zahl2);

        //Operatoren Panel
        operatorenPanel = new Panel();
        operatorenPanel.setLayout(new FlowLayout());

        plus = new Button("+");
        minus = new Button("-");
        multi = new Button("*");
        divi = new Button("/");

        //Regestrieren des Listeners
        plus.addActionListener( new knopfAktion());
        minus.addActionListener( new knopfAktion());
        multi.addActionListener( new knopfAktion());
        divi.addActionListener( new knopfAktion());


        operatorenPanel.add(plus);
        operatorenPanel.add(minus);
        operatorenPanel.add(multi);
        operatorenPanel.add(divi);

        //Ergebnis Panel
        ergebnisPanel = new Panel();

        ergebnis = new Label("Bitte wählen");

        ergebnisPanel.add(ergebnis);

        //Pannels im Container zusammensetzen
        this.add(eingabePanel);
        this.add(operatorenPanel);
        this.add(ergebnisPanel);

        //EventHandling für Hauptfenster
        this.addWindowListener(new WindowAdapter(){
            //@Override
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });


    }
    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            berechnung(e);
        }
    }

    private void berechnung(ActionEvent e){
        double erg = 0.0;
        
        //Umwandlung der Strings in double
        double z1 = Double.parseDouble(zahl1.getText());
        double z2 = Double.parseDouble(zahl2.getText());

        try{
            //Welcher Knopf wurde gedrückt
            //berechnen
            if(e.getActionCommand().equals(plus.getLabel())){
                //Addition
                erg = z1+z2;
            }
            if(e.getActionCommand().equals(minus.getLabel())){
                //Subtraktion
                erg = z1-z2;
            }
            if(e.getActionCommand().equals(multi.getLabel())){
                //Multiplikation
                erg = z1*z2;
            }
            if(e.getActionCommand().equals(divi.getLabel())){
                //Division
                erg = z1/z2;
            }
            //Ausgabe
            ergebnis.setText("Ergebnis: "+String.valueOf(erg) );
        }catch(NumberFormatException nfe){
                nfe.printStackTrace();
                ergebnis.setText("Falsche Eingabe!");
                System.out.println("Fehler!");
                }           
    }
}
 

=_=_=

Mitglied
dass es sich hierbei um ne RuntimeException handelt ... ich glaube gelesen zu haben, dass man diese eben nicht einfach schlucken kann/darf/sollte.

Also eine normale NumberFormatException stammt von einer RuntimeException das stimmt, darüber aber erst von einer IllegalArgumentException und soweit ich jetzt weiss können diese ja ganz normal gefangen werden ohne dass man diese direkt an die höhere Klasse reichen muss, aber ich kann mich da auch irren...
 

r0bbe

Mitglied
Kurz OffTopic von mir, sorry aber das interessiert mich grad.

Java:
if(e.getActionCommand().equals(minus.getLabel())){
   //Subtraktion
   erg = z1-z2;
}

Ist sowas üblich / egal oder sollte man lieber e.getSource == name vom button benutzen?
Ich find's irgendwie "hübscher"^^

vermutlich Geschmackssache oder?

PS: Schonmal Danke, dann spam ich hier ned unnötig rum nur um das zu schreiben ;)

edit: ok überzeugt ;)
 
Zuletzt bearbeitet:

diggaa1984

Top Contributor
Ist sowas üblich / egal oder sollte man lieber e.getSource == name vom button benutzen?

hm nuja, was ändert sich, wenn man das ganze per actionCommand macht?! Ganz einfach, sobald du ner andern Komponente das gleich command zuweist,und den selben actionListener anhängst, reagierst damit auf 2 versch. Komponenten.

ich persönlich, würde wohl actionCommand bevorzugen, denn so müsste ich bei Austausch von Komponenten nicht noch im Listener rumfummeln.
 

Onkel Hatti

Bekanntes Mitglied
Die Exception wird nicht im try-catch Block geworfen.
Nur wenn die Exception dort auftritt, wird sie abgefangen, sonst "nach oben" (in der Aufrufhierarchie) weitergeletet, wenn dort nicht abgefangen von der JVM verarbeitet, d.h. an der Konsole ausgegeben.

Der Abschnitt, der die Exception werfen könnte

Code:
double z1 = Double.parseDouble(zahl1.getText());

muss also mit in den try-Block
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Elemente eine Liste im Ring schliessen Java Basics - Anfänger-Themen 9
I Fenster A soll Fenster B schliessen Java Basics - Anfänger-Themen 5
O Finally beim Fenster schliessen Java Basics - Anfänger-Themen 3
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
S Input/Output nullpointerException beim schliessen von stream Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
L ein Fenser mit einem Button schliessen Java Basics - Anfänger-Themen 5
A Warum schliessen sich beide Fenster? Java Basics - Anfänger-Themen 5
S JMenu schliessen Java Basics - Anfänger-Themen 2
B FileInputStream schliessen: unreported Exception...must be caught Java Basics - Anfänger-Themen 6
kulturfenster Per Button Frame schliessen Java Basics - Anfänger-Themen 2
C Per JButton ein JFrame schliessen Java Basics - Anfänger-Themen 10
G Beide Fenster schliessen sich Java Basics - Anfänger-Themen 19
G Frames unabhänig schliessen. Java Basics - Anfänger-Themen 2
P Fenster schliessen auf Menue heraus Java Basics - Anfänger-Themen 2
N [AWT] Fenster schliessen Java Basics - Anfänger-Themen 4
G JDialog übers X schliessen und Programm beenden Java Basics - Anfänger-Themen 4
T Fenster schliessen? Java Basics - Anfänger-Themen 2
G PinLabel Fenster wieder schliessen Java Basics - Anfänger-Themen 2
G automatisch speichern beim schliessen eines Spiels Java Basics - Anfänger-Themen 13
G Methode zum schliessen eines frames - nicht durch windows X Java Basics - Anfänger-Themen 14
G mehrere JFrames - Problem beim Schliessen Java Basics - Anfänger-Themen 3
F JDialog per Button-Klick schliessen Java Basics - Anfänger-Themen 2
V Ein Fenster durch Menu-Dialog schliessen Java Basics - Anfänger-Themen 2
M 2 frames separat schliessen Java Basics - Anfänger-Themen 22
G frame schliessen Java Basics - Anfänger-Themen 11
P Fenster schliessen aus JTabbedPane/JPanel Java Basics - Anfänger-Themen 3
B Eingabefenster schliessen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben