Announcement

Collapse
No announcement yet.

Funktionsweise des ActionListeners...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Funktionsweise des ActionListeners...

    Hallo,

    wer kann mir sagen wie ich das "Drücken" eines Buttons abfangen kann, und eine entsprechende Aktion (z,B. Fenster schließen o.ä.) in die Wege leiten kann.
    Wäre echt super wenn mir jemand einen kleinen Fetzen Quellcode schicken kann...schankedön...Flo

  • #2
    Das Event-Handling von Java funktioniert nach dem sogenannten Observer-Pattern. Das bedeutet, dass Du ein Objekt bei einem anderen Objekt anmeldests, um von diesem über Änderungen automatisch informiert zu werden.
    In Deinem Fall bedeutet das, dass Du am Button-Objekt ein ActionListener-Objekt anmelden muss. Dieses hat eine Methode <pre>actionPerformed(ActionEvent e)</pre>. Diese dient dann dem Button als sogenannter Callback, was heisst, dass der Button diese Methode aufruft, wenn er gedrückt wird (denn das löst einen ActionEvent aus). Du hast nun die Wahl, ob Du für den ActionListener eine eigene Klasse z.B. MyButtonListenerForWindowClosing definierst oder einfach eine anonyme Klasse ohne eigenes Source-File erstellst, was in diesem Fall eines einfachen ActionListeners sinnvoller ist.
    Das ganze sieht dann etwa so aus:
    <pre>
    button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    // was soll passieren, wenn Knopf gedrückt wird?
    window.setVisible(false);
    }
    );
    </pre&gt

    Comment


    • #3
      Hallo Guido,

      danke erstmal für Deine Ratschläge,hat soweit auch alles ganz gut geklappt, bin dann aber auf ein weiteres Problem gestoßen:
      in der letzten Zeile meckert der Compiler nämlich immer, dass Methoden, die innerhalb geschweifter Klammern aufgerufen werden, als final deklariert werden müssen. Das macht aber irgendwie für mich keinen Sinn, hab's von der Syntax her auch nicht gebacken gekriegt...würde mich nochmal sehr über einen Tip von Dir freuen, vielen dank schon mal...Flo

      Button but = new Button();
      but.setSize(100,100);
      but.setVisible(true);
      fenster.add(but);

      but.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
      but.setVisible(false);}})

      Comment


      • #4
        Das Problem ist nicht, dass Methoden innerhalb geschweifter Klammern final sein müssen, sondern, dass Du bei sogenannten inner classes nicht auf Variablen der outer class zugreifen kannst, die nicht final sind.
        In Deinem Fall greifst Du von der inneren, anonymen ActionListener Klasse auf die Variable but der äußeren Klasse zu. Das ist nicht zulässig.
        Es gibt nun zwei Möglichkeiten, das Problem zu lösen:

        1. Du deklarierst but final oder verwendest einfach eine neu Variable finalBut
        <pre>
        final Button but = new Button(); ...
        </pre>
        oder
        <pre>
        final Button finalBut = but; // diese Variable dann im ActionListener verwenden
        </pre>

        2. Du greifst auf den Auslöser des ActionEvents zu
        <pre>
        but.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
        ((Button)e.getSource()).setVisible(false);
        }
        });
        </pre>

        Im zweiten Fall kannst Du dann den Listener sogar noch an andere Buttons hängen, damit diese das gleiche Verhalten haben. Aber Vorsicht: das Casten nach Button schmeißt natürlich eine Exception, wenn Du versuchst den ActionListener an eine Komponente zu hängen, die kein Button ist

        Comment

        Working...
        X