WindowStateListener selbst implementieren

Diskutiere WindowStateListener selbst implementieren im Java Basics - Anfänger-Themen Forum; Guten Tag! Ich möchte gern dass meine Fenstern (Frames) ein selbst programmiertes WindowsStateListener namens "FrameEventHandler " haben. Ich...

  1. MBoerner
    MBoerner Neues Mitglied
    Guten Tag!

    Ich möchte gern dass meine Fenstern (Frames) ein selbst programmiertes WindowsStateListener namens "FrameEventHandler " haben.
    Ich möchte zum Beispiel, dass alle WindowEvents eine zeile ausgeben. Ich habe es so gemacht:
    Im Frame:
    Attribut:
    protected FrameEventHandler eventHandler;
    Im Constructor:
    eventHandler = new FrameEventHandler(this);
    this.addWindowStateListener(eventHandler);

    Die klasse "FrameEventHandler" enthält eine Funktion windowStateChanged und ist so:
    "
    public class FrameEventHandler extends WindowAdapter{
    ….
    @Override
    public void windowStateChanged(WindowEvent we){

    //Event anzeigen
    System.out.println("windowStateChanged"+ we.toString());

    }
    Ich möchte bewusst eine eigene Klasse für den neuen WindowStateListener.
    Ich sehe zwar, dass ein neues FrameEventhandler gebaut wird, aber die FunktionwindowStateChanged wird nie ausgeführt, egal, was ich mit dem Fenster mache (schliessen, verkleinern, etc...)
    Kann mir jemand erklären was fehlt?

    Vielen Dank im Voraus
     
  2. Vielleicht hilft dir dieser Kurs hier weiter.
  3. mihe7
    mihe7 Bekanntes Mitglied
    Hast Du auch minimieren, maximieren probiert? Wenn ja, dann poste mal kompletten Code (bitte in Code-Tags setzen: [code=Java]Dein Code[/code])
     
  4. MBoerner
    MBoerner Neues Mitglied
    Danke schön Mihe7, ich kann es leider erst heute abend nach Feierabend machen. Ich poste dann den Code.
     
  5. MBoerner
    MBoerner Neues Mitglied
    Entschuldigung, mein Notebook war eine Weile außer Gefecht.
    Hier ist der Code der Klasse, die ich als EventHandler benutzen möchte:
    Code (Java):

    import java.awt.*;
    import java.awt.event.*;
    import java.util.Hashtable;
    import java.util.Enumeration;
    public class FrameEventHandler extends WindowAdapter{
       
         private DokumentAusgabeIF ausgabeModel;
         private int zeile, spalte;
         Hashtable modelTable;
         Object key;
         private DokumentAusgabe ausgabe;
       
      /**
         *Diese Funktion schliesst das Frame und beendet das Ton abspielen
         *wenn es ein Ton/MP3 Dokument war
         *@param we WindowsEvent
       
         */

         @Override
         public void windowStateChanged(WindowEvent we){
           System.out.println("frameEventHandler WindowsEvent");  
         }
       
         public void windowClosing(WindowEvent we) {
           System.out.println("frameEventHandler WindowsClosing");
           ausgabe.actionBeenden();
         }
       
         public FrameEventHandler(DokumentAusgabe ausgabe)
         {
             System.out.println("frameEventHandler");
          modelTable = new Hashtable();
          addModel(ausgabe);
         }
       
         public void addModel(DokumentAusgabe model) {
          key=new Integer(model.hashCode());
          modelTable.put(key, model);
         }
       
         public void removeModel(DokumentAusgabe ausgabe) {
          key=new Integer(ausgabe.hashCode());
          modelTable.remove(key);
         }

     
    Und hier ist der Code, vom Frame, bei dem ich den WindowState in einer separaten Klasse behandeln möchte
    Code (Java):

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.WindowEvent;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.ListIterator;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    public class DokumentAusgabe extends JFrame{
       
        static public LinkedList fensterListe= new LinkedList();
        protected int topInset;
        protected static Dimension mainSize;
        protected FrameEventHandler eventHandler;
       
        private static final int  X_POS=200;
        private static final int  Y_POS=200;
        private static final int  INDENT=30;
       
        public DokumentAusgabe() {
           }
       
        public DokumentAusgabe(Dimension mainSize) {
     this.mainSize = mainSize;
        }
       
       
       
        public void erzeugeFenster(DokumentAusgabe ausgabe, Dokument doc, String titel) {
     int index;
     this.setTitle(titel);
     this.setSize(300,100);
     this.topInset = Main.getTopInset();
     
     index= addAusgabeToList((JFrame)this);
     this.setLocation(Main.getTopInset()+ this.mainSize.width + (index*INDENT), Y_POS + (index*INDENT));
     this.setResizable(false);
     this.setVisible(true);
     eventHandler = new FrameEventHandler(ausgabe);
     ausgabe.addWindowStateListener(eventHandler);
        }
     
    Die Funktion "erzeugeFenster" wird ausgeführt, wenn ich ein Fenster öffne (ein Frame "ausgabe")
    In der Ausgabe sehe ich "frameEventHandler" also wird der Konstruktor von "FrameEventHandler" ausgeführt.
    Aber wenn ich ein Fenster "ausgabe" Schliessen, wird es zwar geschlossen aber keine Funktion von "frameEventHandler" wird ausgeführt

    Was mache ich das falsch?
    Vielen Dank im Voraus
     
  6. mrBrown
    mrBrown Super-Moderator Mitarbeiter
    Zeig mal, wo du Fenster erzeugst.

    Das da mit ausgabe und this in der Methode den gleichen Typ haben und beide benutzt werden, ist zumindest verdächtig, vermutlich erzeugst du zwei Fenster, von denen nur eins angezeigt wird
     
  7. MBoerner
    MBoerner Neues Mitglied
    Das Fenster wird erzeugt, wenn man auf einen Knoten in einem Treeview doppelklickt.
    Jeder Knoten ist entweder ein Ordner, ein Bild oder ein Tondokument.
    Die Klasse DokumentAusgabe erbt von JFrame

    Code (Java):

    package medien;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.Toolkit;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import javax.swing.JPanel;
    public class BildDokumentAusgabe  extends DokumentAusgabe implements DokumentAusgabeIF{
     
        private Image bild;
        private String bildName;
     
        public BildDokumentAusgabe(BildDokument bildDokument) {
     
     bildName = bildDokument.getName();
     [B]erzeugeFenster[/B](this, (Dokument) bildDokument, "BilddokumentAusgabe Ausgabe");
     if(this.bildLaden(bildDokument.getFilePath())) {
         this.setSize(this.limitSize(bild.getWidth(this), bild.getHeight(this)));
     }
     else
     {
         this.setSize(400,  100);
     }
     this.setContentPane(new JPanel() {
         @Override
         public void paintComponent(Graphics g) {
      g.drawImage(bild,  0, 0, this);
         }
       
     });

        }
     
     
     
        private boolean bildLaden(String filePath) {
     
     
     this.bild = Toolkit.getDefaultToolkit().getImage(filePath);
         MediaTracker tracker = new MediaTracker(this);
         tracker.addImage(this.bild, 0);
         try {
       tracker.waitForID(0);
       return true;
     }
     catch (InterruptedException ie){
       System.out.println(ie.toString() + " beim Laden des Bildes "+ filePath);
       return false;
     }
     
        }
     
     
  8. mrBrown
    mrBrown Super-Moderator Mitarbeiter
    Erstmal: Wenn du irgendwo casten musst, machst du was falsch. Alle casts in deinem Code sind überflüssig und machen das ganze nur schlechter lesbar.

    Dann: an eine Methode von sich selbst this zu übergeben, ist Unsinn und nur Fehlerquelle, streich das auch aus deinem obigen Code.

    Dann: erbe nicht von Frame, sondern nutz einfach ein JFrame.

    Dann: Generics gibts nicht ohne Grund.

    Und dann der Grund für den Probleme: nutz addWindowListener anstatt addWindowStateListener
     
    mihe7 gefällt das.
  9. MBoerner
    MBoerner Neues Mitglied
    OK, danke schön, ich versuche es.
    Vielen Dank für die Tips
     
  10. MBoerner
    MBoerner Neues Mitglied
    Ja mit dem addWindowListener klappt es, da bin ich schon ein Stück weiter, vielen Dank!
     
  11. Wenn du Java lernen möchtest, empfehlen wir dir diesen Kurs hier
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

WindowStateListener selbst implementieren - Ähnliche Themen

MapStruct Anwendung vom selbst geschriebenen Formater
MapStruct Anwendung vom selbst geschriebenen Formater im Forum Java Basics - Anfänger-Themen
Innerhalb eines Jahres intensivem Java-Selbststudium zur Anstellung?
Innerhalb eines Jahres intensivem Java-Selbststudium zur Anstellung? im Forum Java Basics - Anfänger-Themen
Kindklassen sollen Ihre Methoden selbst implementieren
Kindklassen sollen Ihre Methoden selbst implementieren im Forum Java Basics - Anfänger-Themen
Hilfe - Selbst Informatik Lehrer konnte mir nicht weiter Helfen
Hilfe - Selbst Informatik Lehrer konnte mir nicht weiter Helfen im Forum AWT, Swing, JavaFX & SWT
Vererbung Selbstreferenzparameter
Vererbung Selbstreferenzparameter im Forum Allgemeine Java-Themen
Thema: WindowStateListener selbst implementieren