[Java] Klasse aufrufen

tefla

Erfahrenes Mitglied
Hallo zusammen,

ich habe mir ein kleines Programm geschrieben mit einem Menü, aus jenem sollen Actioncommands bei Mausklick aufgerufen werden. Dies funktioniert auch. Allerdings will ich bei "Beenden" meine Klasse WindowClosingAdapter aufrufen. Aber der will leider nicht so wie ich will.

Code:
public class menu extends MenuBar implements ActionListener {
     public menu(){
                Menu m;
		MenuShortcut ms;
		MenuItem mi;
		// DATEI
		
		m = new Menu("Datei");

		ms = new MenuShortcut(KeyEvent.VK_N);
		mi = new MenuItem("Beenden",ms);
		mi.addActionListener(this);
		mi.setActionCommand("Beenden");
		m.add(mi);
     }

     public void actionPerformed(ActionEvent klick) {
           if(klick.getActionCommand().toString().equals("Beenden")) {
			System.out.println("Und Tschüss ...");	
			addWindowListener(new WindowClosingAdapter());
	   }
     }
}

Meine Datei WindowClosingAdapter

public class WindowClosingAdapter
 extends WindowAdapter
 {
   private boolean exitSystem;
   public WindowClosingAdapter(boolean exitSystem)
   {
     this.exitSystem = exitSystem;
   }
   public WindowClosingAdapter()
   {
     this(false);
   }
 
   public void windowClosing(WindowEvent event)
   {
     event.getWindow().setVisible(false);
     event.getWindow().dispose();
     if (exitSystem) {
       System.exit(0);
     }
   }
 }

Ich hoffe ihr wisst was ich meine und könnt mir helfen. Danke.
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

Du musst das etwas anders angehen...

Den WindowClosingAdapter musst du bei dem Frame bzw. JFrame registrieren der dein Menu "enthält" ...

Code:
im Konstruktor des Frames / JFrames
...
this.setWindowListener(new WindowClosingAdapter());
//jetzt Menubar hinzufügen
...

wenn du deine Applikation beenden willst, wenn zum Beispiel jemand auf den Exit Button deines Menüs klickt musst du das einfach in deiner actionPerformed-Methode machen...:

---> Fenster verstecken mit hide();
---> Fensterressourcen freigeben mit dispose();
---> Programm beenden mit System.exit(0);

Code:
public void actionPerformed(ActionEvent klick) {
           if(klick.getActionCommand().toString().equals("Beenden")) {
			System.out.println("Und Tschüss ...");	
           //Referenz zum Frame besorgen...  
		Frame f = this.getParent();
           //bzw. JFrame f = this.getParent();
           //Kann auch sein, dass du die getParent Methode Kaskadierend aufrufen musst, damit du an die Frame referenz dran kommst ...
//Frame f = this.getPrent().getParent().getparent()....;
           f.hide();
           f.dispose();
           System.exit(0);
	   }
     }

... oder (Um eine Referenc des Frames zu bekommen)
du übergibst einfach im Konstruktor von deiner menu Klasse einen Frame als Parameter ... (Typ kann auch Objekt sein ... wir brauchen ja nur die Referenz...

meine:

Code:
//Konstruktor Frame
...
//bei AWT
.add(new menu(this));   // "this" ist unser Frame
//bei Swing
//.getContentPane().add(new menu(this));
...


in deiner Klasse menu hast du dann noch ne Membervariable vom Typ Frame

Code:
class menu extends ...

Frame f = null;

//Konstruktor menu

public menu(Frame frm){
    ...
    this.f = frm;
    ...

}

... 

dann brauchst du die getParent() Aufrufe nicht und kannst direkt mit der Refernenz vom Frame (f) arbeiten ...

Hoffe das war nicht zu wirr ... ;-)

Gruss Tom
 
Zuletzt bearbeitet:

tefla

Erfahrenes Mitglied
wenn du deine Applikation beenden willst, wenn zum Beispiel jemand auf den Exit Button deines Menüs klickt musst du das einfach in deiner actionPerformed-Methode machen...:

---> Fenster verstecken mit hide();
---> Fensterressourcen freigeben mit dispose();
---> Programm beenden mit System.exit(0);

Code:
public void actionPerformed(ActionEvent klick) {
           if(klick.getActionCommand().toString().equals("Beenden")) {
			System.out.println("Und Tschüss ...");	
           //Referenz zum Frame besorgen...  
		Frame f = this.getParent();
           //bzw. JFrame f = this.getParent();
           //Kann auch sein, dass du die getParent Methode Kaskadierend aufrufen musst, damit du an die Frame referenz dran kommst ...
//Frame f = this.getPrent().getParent().getparent()....;
           f.hide();
           f.dispose();
           System.exit(0);
	   }
     }

Ich würde aber gerne statt
f.hide();
f.dispose();
System.exit(0);

meine WindowClosingAdapter Klasse benutzen, da ich hier später Änderungen vornehmen kann und ich nicht jede Klasse umschreiben will, wenn sich der Beenden Dialog oder ähnliches ändert. Um dann einen System.exit(0) zu erzielen rufe ich in meinem Frame die Klasse so auf:

Frame wnd = new Frame("This");
...
wnd.addWindowListener(new WindowClosingAdapter(true));

dies funktioniert aber nicht in der anderen Klasse, auch wenn ich folgendes mache:

if(klick.getActionCommand().toString().equals("Beenden")) {
System.out.println("Und Tschüss ...");
Frame wnd = (Frame) this.getParent();
wnd.addWindowListener(new WindowClosingAdapter(true));
}

der Compiler bringt mir zwar kein Fehler, aber auch kein Beenden.

Ansonsten hat mir das schonmal ein wenig weitergeholfen. Vielen Dank.
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

... ups.. *g*

versuchs mal mit ...klick.getSource() ...
Entweder bekommst du da den Frame zurück oder die Menubar ...
kannst du dann mit
klick instanceof Frame
klick instanceof JFrame
klick instanceof was_auch_immer ...

sehen ...

hab heute und morgen früh leider keine Zeit die Beispiele auszuprobieren da ich noch 3 wichtige Klausuren vor mir hab ...

ich mach's mal morgen Mittag...

Gruss Tom
 
Zuletzt bearbeitet:

tefla

Erfahrenes Mitglied
dank dir.

mach dir keine stress klausuren sind wichtiger und google gibt ja auch ab und zu noch was her. auch wenn solche konkreten beispiele schwer zu finden sind.
 

Neue Beiträge