Listener_Info 1/2 Interface – template of behavior Einschleusen

Werbung
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);
}
Herunterladen