21.4.3 Die Zeichenfläche für einen Button und Polymorphie
 
Eigene Zeichenfläche Wir fügten unserem Button eine Zeichenfläche zu, die das übergebene Bild aufnimmt. Unser Panel, wir nenne es ButtonPanel erbt von JPanel.
 
Download:
ButtonPanel.java
import javax.swing.*;
import java.awt.*;
class ButtonPanel extends JPanel {
    Image bild;
    public ButtonPanel(Image bild){
      this.bild = bild;
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bild,0,0,this);
    }
}
Polymorphie An der Parameterliste des Konstruktors erkennt man, dass zur Anlage eines Objektes von ButtonPanel ein Objekt des Typs image erwartet wird. Die Methode paintComponent(Graphics g) wird automatisch aufgerufen, wenn sich an der grafischen Darstellung etwas geändert hat. Im ersten Moment denkt man, dass ein erneutes Zeichnen nicht nötig ist. Nun kann aber unser Fenster von einem Fenster einer anderen Anwendung kurzfristig überdeckt werden, so dass beim Wiederaufdecken das Neuzeichnen nötig wird.  Das alles wird komfortabel in der Methode paintComponent(Graphics g)wie sie in der Klasse JComponent implementiert vor liegt. Unsere Klasse ButtonPanel erbt diese Methode über JPanel von JComponent. Die geerbte Methode paintComponent(Graphics g) soll um das Hinzufügen des Bildes - g.drawImage(bild,0,0,this)- erweitert werden.  Da wir aber jetzt im Begriff sind, diese Methode zu überschreiben, würden wir die ganze Funktionalität von paintComponent(Grahics g) verlieren, wenn wir nicht die unverfälschte Methode mit super.paintComponent(Graphics g) aufrufen würden. Mit super haben wir eine Referenz auf die Superklasse, also die Klasse, von der unsere Klasse direkt erbt also JPanel. Damit haben wir die alte Methode in ihrer Funktionalität erweitert. Das hat zur Folge, dass das was die Methode paintComponent(Grahics g) leistet, von ihrem Kontext ab. Wir sprechen in diesem Zusammenhang von Polymorphie.
 
Klassen- hierarchie Die Grafik macht den Zusammenhang beim Vererben noch einmal deutlich. Die Methode paintComponent(...) wird an JPanel vererbt, steht dort zur Verfügung, ohne neu implementiert werden zu müssen. Da ButtonPanel von JPanel erbt, steht auch dort diese Methode paintComponent(...) zur Verfügung. Hier aber überschreiben wir diese Methode, die geerbte verliert damit hier ihre Gültigkeit. Die Funktionalität der alten 'retten' wir, in dem wir die neue Methode die alte, das ist paintComponent(...) in JPanel ausführen lassen. Der Aufruf einer überschrieben Methode geschieht mit super.paintComponent(...)
 
Wiederverwend-barkeit Die Klasse ButtonPanel ist so angelegt, dass sie nicht nur für das Button CaesarButton, sondern für jedes andere selbst geschrieben Button verwendet werden kann, um dieses mit einem Bild zu versehen.
   
zur Startseite www.pohlig.de  (C) MPohlig 2003