Blog der Heimetli Software AG

Swing-Events mit einer Lambda-Funktion behandeln

Die Syntax für innere Klassen zur Behandlung der Swing-Events ist nicht gerade intuitiv. Seit Java 1.8 gibt es die Lambda-Funktionen in Java, die mindestens für einen Teil der Handler eine innere Klasse überflüssig machen.

Das folgende Programm zeigt auf, wieviel einfacher der Code dadurch wird:

/******************************************************************************/
/*                                                                            */
/*                                                          FILE: Lambda.java */
/*                                                                            */
/*       A simple example for a lambda function to handle an event            */
/*       =========================================================            */
/*                                                                            */
/*       V1.00    24-MAR-2015  Te          https://blog.heimetli.ch           */
/*                                                                            */
/******************************************************************************/

import java.awt.* ;
import javax.swing.* ;

public class Lambda
{
   public static void main( String[] args )
   {
      JFrame frame   = new JFrame( "Event Handler mit Lambda" ) ;
      JButton button = new JButton( "Click mich !" ) ;

      frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ) ;
      frame.add( button, BorderLayout.CENTER ) ;

      // This is the notable code
      button.addActionListener( event -> button.setText("Nicht so hart !") ) ;

      frame.setSize( 300, 300 ) ;
      frame.setVisible( true ) ;
   }
}

Bis auf die Zeile mit dem Kommentar enthält der Code nichts besonderes.

Die markierte Zeile zeigt auf, wie ein ActionListener mit einem Lambda realisiert wird: addActionListener( event -> button.setText("Nicht so hart !") ).

addActionListener erwartet ein Objekt das das ActionListener-Interface implementiert. Weil diese Interface genau eine Methode spezifiziert, kann man an dieser Stelle eine Lambda-Funktion einsetzen.

In dieser Situation akzeptiert der Compiler sogar eine vereinfachte Syntax. Die Klammern um das Argument kann man weglassen, ebenso wie die geschweiften Klammern um den Block der Funktion.

Ab jetzt gibt es in meinem Code wohl nie mehr innere Klassen für ActionEvents ;-)

Source von Lambda.java herunterladen.