481355672 1/2 Interface – template of behavior Einschleusen von Funktionalität, die nicht in die Klassenhierarchie passt. Drei Möglichkeiten, ein Interface zu Implementieren. Demo an Hand des Interfaces „ActionListener“: 1) Zentralistische Variante: eine actionPerformed-Methode (für ev. mehrere Ereignisquellen) Listener.java import java.awt.*; import javax.swing.*; import java.awt.event.*; //Graphics, LayoutManager //Swing-J-Komponenten //Event-Handler public class Listener extends JApplet implements ActionListener { JLabel myLabel1; int n=0; public void init() { JPanel myPane = new JPanel(); myPane.setLayout(new GridLayout(1,2,5,1)); //rows,cols,hgap,vgap setContentPane(myPane); JButton myButton1 = new JButton("do it!"); myPane.add(myButton1); myLabel1 = new JLabel("?",JLabel.CENTER); myPane.add(myLabel1); myButton1.addActionListener(this); /* this = jener Ereignisempfänge, der durch "implements ActionListener" (s.o.(Z.14)) angekündigt wurde. Dessen (einzige) abstrakte Methode "actionPerformed()" muss(!) überschrieben werden. Andernfalls erhält man die Fehlermeldung: "Listener is not abstract and does not override abstract method actionPerformed (java.awt.event.ActionEvent) in java.awt.event.ActionListener." M.a.W.: die actionPerformed-Metode 'dieser' aktuellen Klasse bzw. 'dieses' Codeabschnitts */ }//init //zentralistische Variante: eine actionPerformed-Methode (für ev. mehrere Ereignisquellen) public void actionPerformed(ActionEvent ae) { n++; myLabel1.setText("done "+n); }//actionPerformed }//finis 2) Variante mit innerer Classe: Listener.java import java.awt.*; import javax.swing.*; import java.awt.event.*; //Graphics, LayoutManager //Swing-J-Komponenten //Event-Handler public class Listener extends JApplet { JLabel myLabel1; int n=0; 481355672 2/2 public void init() { JPanel myPane = new JPanel(); myPane.setLayout(new GridLayout(1,2,5,1)); //rows,cols,hgap,vgap setContentPane(myPane); JButton myButton1 = new JButton("do it!"); myPane.add(myButton1); myLabel1 = new JLabel("?",JLabel.CENTER); myPane.add(myLabel1); myButton1.addActionListener(new myListener()); }//init //innere Classe class myListener implements ActionListener{ public void actionPerformed(ActionEvent ae) { n++; myLabel1.setText("done "+n); }//actionPerformed }//myListener }//finis 3) Variante mit anonymer innerer Classe: Listener.java import java.awt.*; import javax.swing.*; import java.awt.event.*; //Graphics, LayoutManager //Swing-J-Komponenten //Event-Handler public class Listener extends JApplet { JLabel myLabel1; int n=0; public void init() { JPanel myPane = new JPanel(); myPane.setLayout(new GridLayout(1,2,5,1)); //rows,cols,hgap,vgap setContentPane(myPane); JButton myButton1 = new JButton("do it!"); myPane.add(myButton1); myLabel1 = new JLabel("?",JLabel.CENTER); myPane.add(myLabel1); /*Variante mit anonymer innerer Classe (syntaktische Abkürzung): Es wird zugleich eine (anonyme) Classe erzeugt und eine Instanz dieser Classe aufgerufen. */ myButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { n++; myLabel1.setText("done "+n); }//actionPerformed }//ActionListener );//addActionListener }//init }//finis N.B.: API-Code für das ActionListener-Interface: ActionListener.java package java.awt.event; import java.util.EventListener; public interface ActionListenerextends EventListener { public void actionPerformed(ActionEvent e); }