WindowClosing

Status
Nicht offen für weitere Antworten.
M

marino610

Gast
Hallo!

Ich habe folgendes angefangenes Programm:

Code:
import java.awt.*;
import java.awt.event.*;

class Regale extends Frame {
  
  private Canvas c = new Canvas();
  
  public Regale() {
    super("Regale");
    setSize(800, 500);
    add(c);
    setVisible(true);
    zeichneRegale();
    
    addWindowListener(new WindowAdapter() {
      public void WindowClosing(WindowEvent e) {
        setVisible(false);
        dispose();
        System.exit(0);
      }
    });
  }
  
  public void zeichneRegale() {
    Graphics g = c.getGraphics();
    g.drawLine(30, 50, 330, 50);
    g.drawLine(30, 100, 330, 100);
    g.drawLine(30, 150, 330, 150);
    g.drawLine(30, 200, 330, 200);
    g.drawLine(30, 250, 330, 250);
    g.drawLine(30, 300, 330, 300);
    g.drawLine(30, 350, 330, 350);
    g.drawLine(30, 400, 330, 400);
    g.drawLine(450, 50, 750, 50);
    g.drawLine(450, 100, 750, 100);
    g.drawLine(450, 150, 750, 150);
    g.drawLine(450, 200, 750, 200);
    g.drawLine(450, 250, 750, 250);
    g.drawLine(450, 300, 750, 300);
    g.drawLine(450, 350, 750, 350);
    g.drawLine(450, 400, 750, 400);
    
  }

  public static void main(String args[]) {
    Regale r = new Regale();
  }
}

Eigentlich sollte doch jetzt das Fenster beim Klick auf X oben rechts geschlossen werden. Hab's genauso schon oft hinbekommen, aber hier passiert gar nix.
Außerdem werden die gezeichneten Linien nicht jedesmal angezeigt. Wenn ich dann schließe und nochmal starte sind sie wieder da.
Woran kann das liegen?
 

Leroy42

Top Contributor
Die Methode heißt
Code:
public void windowClosing(WindowEvent e) {
...

mit kleingeschriebenem w. Du hast also die Methode nicht überschrieben, sondern
eine völlig neue Methode geschrieben, die keiner kennt und darum auch nicht aufruft.

Das 2. Problem liegt daran, daß alle Anweisungen etwas zu zeichnen in einer bestimmten
Methode public void paint(Graphics g) ausgeführt werden müssen. Dies auch darum, damit
nach Verdeckungen des Fensters, díe GUI dies automatisch machen kann. Es bringt also nichts,
selbst deine Methode zeichneRegale aufzurufen. Dies muß in der eben erwähnten Methode
passieren.

Da dieser Methode der Graphics-Kontext bereits übergeben wird, solltest du ihn an
deine zeichneRegale weiterreichen und dort nicht selbst besorgen.
 
M

marino610

Gast
Danke Leroy, hast mir sehr geholfen!

Ganz blöder Fehler, eine Methode mit großzuschreiben...
 

Murray

Top Contributor
Ab JDK 1.5 gibt es mit der Annotation @Override Unterstützung für solche Probleme: wenn man vorhat, eine Methode zu überschreiben, dann setzt man einfach diese Annotation davor. Wenn man dann den Namen falsch schreibt, oder die Parameterliste nicht genau wie in der Basisklasse definiert, dann meckert der Compiler:
Code:
addWindowListener(new WindowAdapter() {
      @Override
      public void WindowClosing(WindowEvent e) {
        setVisible(false);
        dispose();
        System.exit(0);
      }
    });

Compiler hat gesagt.:
method does not override a method from its superclass
 

Leroy42

Top Contributor
Das ist ja praktisch :D

Weißt du auch ob man diese Source auch unter 1.4 übersetzen kann?
Überliest er dann diese Annotation oder meckert er rum? Außer bei
privaten Anwendungen verzichte ich auf die neuen 1.5 Features, weil z.B.
unser Provider nach wie vor einen 1.4-Compiler nutzt, und ich mir
nichts falsches angewöhnen will.
 

L-ectron-X

Gesperrter Benutzer
@Leroy42: Der WindowAdapter ist seit 1.1 mit drin.
Wie das mit inneren, anonymen Klassen ist...
...ich glaube auch seit 1.1.
Also solltest du das auch unter 1.4 zum Laufen bekommen.
 

Murray

Top Contributor
@L-ectron-X: ich dachte, Leroy ginge es speziell um die @Override-Annotation. Der Rest sollte natürlich klappen.
 

L-ectron-X

Gesperrter Benutzer
Dann habe ich möglicherweise was falsch verstanden.
Man möge einem alten Mann verzeihen... :wink:
 

Leroy42

Top Contributor
Murray hat gesagt.:
Annotations kann man unter 1.4 leider nicht nutzen, da meckert der Compiler.
Dann kann ich mich wohl nach wie vor nicht des zweifelhaften Vergnügens berauben,
stundenlang (naja, fast) frustriert im Code zu wühlen, System.out's ein- und auszubauen,
nur um schließlich zu entdecken, daß ich mal wieder in ein simples Anfänger-Signatur-Loch
gefallen bin :(

@ Lectron

Darf sich hier eigentlich jeder dahergelaufene als Foren-Opi bezeichnen, nur
um auf Mitleid plädieren zu können?

:wink: :wink: :wink:
 

Murray

Top Contributor
Leroy42 hat gesagt.:
Dann kann ich mich wohl nach wie vor nicht des zweifelhaften Vergnügens berauben,
stundenlang (naja, fast) frustriert im Code zu wühlen, System.out's ein- und auszubauen,
nur um schließlich zu entdecken, daß ich mal wieder in ein simples Anfänger-Signatur-Loch
gefallen bin :(
Ohne Java 1.5 geht da wohl nichts.
BTW: so wirklich simpel sind diese Signaturfehler leider nicht immer: manchmal passiert es, dass in einer neuen Version einer Basisklasse eine Methode überladen und die Methode mit der alten Signatur auf die neue abgebildet wird; der Autor meint dann, die Klasse abwärtskompatibel geändert zu haben. Wenn man jetzt aber die Methode mit der alten Signatur in einer abgeleiteten Klasse überschrieben hat und meint, damit sämtliche Verwendungen erwischt zu haben, dann fällt man mit der neuen Version der Basisklasse auf die Nase.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben