Einführung in Spezialkomponenten in Swing (JFC, Java) im Rahmen der Lehre des Programmierens mit der Programmiersprache Java. [] (), Lektion, Seite 721641
http://www.purl.org/stefan_ram/pub/java_swing_spezialkomponenten_de ist die kanonische URI dieser Seite.
Stefan Ram

Spezialkomponenten in Swing

Eine Komponente, beispielsweise eine Platte, kann auch dadurch erzeugt werden, daß eine Swing -Komponentenklasse erweitert  wird. In der Erweiterung können dann Methoden wie gewünscht überschrieben werden. So entsteht eine Spezialkomponente (custom component ).

In dem Programm "CustomPanel.java" wird eine Komponente "ButtonPanel" durch Erweitung der Klasse "javax.swing.JPanel" erzeugt. Die Klasse unterstützt damit alle Operationen der Klasse "javax.swing.JPanel". Der parameterlose Konstruktor "ButtonPanel()" wird so deklariert, daß er eine Tastfläche zu der Platte hinzuzufügt. Damit ist eine Tastflächenplatte "ButtonPanel" also eine Platte mit einer Tastfläche. In der Hauptmethode "main" wird dann eine solche Tastflächenplatte zu dem Fenster "frame" hinzugefügt.

CustomPanel.java
public class CustomPanel  
{ public static void main( String[] args ) 
{ javax.swing.JFrame.setDefaultLookAndFeelDecorated( true ); 
javax.swing.JFrame frame = new javax.swing.JFrame( "CustomPanel" ); 
ButtonPanel panel = new ButtonPanel(); frame.getContentPane().add( panel ); 
frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE ); 
frame.pack(); frame.setVisible( true ); }}
class ButtonPanel extends javax.swing.JPanel  
{ ButtonPanel() 
{ final javax.swing.JButton button = new javax.swing.JButton( "JButton" ); 
this.add( button ); }}

Fenster
.-----------. 
| O o O X | 
|.---------.| 
|| JButton || 
|'---------'| 
'-----------'

Erweiterung eines Fensters

Durch Erweiterung der Klasse "javax.swing.JFrame" kann ein Spezialfenster (custom frame ) erzeugt werden. Das wird häufig gemacht, um ein Fenster mit speziellen Eigenschaften zu konstruieren. Bei diesem Abschnitt wird aber ein bewußt einfaches Beispiel verwendet, in dem noch keine zusätzlichen Eigenschaften zu dem Fenster hinzugefügt werden.

Da Konstruktoren nicht vererbt werden, wird eine Konstruktordeklaration benötigt. Hier wird eine Konstruktor deklariert, der eine Kette akzeptiert und an den Konstruktor der Oberklasse weiterleitet, um damit bei der Exemplarerzeugung den Fenstertitel festsetzen zu können.

Das erzeugte Fenster ist möglicherweise zunächst recht klein, da die Erweiterung "JFrame1" keine größere Wunschgröße festgelegt hat. Die Festlegung solch einer Wunschgröße bedarf einiger Erklärungen und wird deswegen noch nicht in dieser Lektion behandelt. Das Fenster kann aber vom Bediener des Prozesses vergrößert werden, um besichtigt zu werden.

CustomFrame.java
public class CustomFrame  
{ public static void main( String[] args ) 
{ JFrame1.setDefaultLookAndFeelDecorated( true ); 
JFrame1 frame = new JFrame1( "Custom Frame" ); 
frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE ); 
frame.pack(); frame.setVisible( true ); }}
class JFrame1 extends javax.swing.JFrame 
{ JFrame1( final String s ){ super( s ); }}

Fenster
.-. 
|O| 
'-'

Einbau einer statische Hauptmethode

Die statische Hauptmethode "main" kann auch in einer Klasse einer Spezialkomponente definiert werden, wenn sie eng mit dieser Spezialkomponente verbunden ist. Dabei wird in der statischen Methode "main" nun ein Exemplar der Klasse erzeugt, in der diese statische Methode enthalten ist. Eine statische Methode kann ja ausgeführt werden, ohne daß ein Exemplar ihrer Klasse existieren muß. Die Exemplarerzeugung "new JFrame1( "JFrame1" )" übergibt die Kontrolle dann an den Konstruktor "JFrame1", die wiederum den Kontruktor der Überklasse "javax.swing.JFrame" aktiviert, wodurch dann schließlich ein Fenster erzeugt wird.

JFrame1.java
class JFrame1 extends javax.swing.JFrame 
{ JFrame1( final String s ){ super( s ); } // Konstruktor
public static void main( String[] args ) 
{ JFrame1.setDefaultLookAndFeelDecorated( true ); 
JFrame1 frame = new JFrame1( "JFrame1" ); // Kontrolle geht an Konstruktor 
frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE ); 
frame.pack(); frame.setVisible( true ); }}

Fenster
.-. 
|O| 
'-'

Kontrollfluß bei Ausführung von "java JFrame1"
.--------------------------------.
| Java-Maschine |
'--------------------------------'
|
V
.--------------------------------.
| JFrame1.main |
'--------------------------------'
|
V
.--------------------------------.
| JFrame1-Konstruktor |
'--------------------------------'
|
V
.--------------------------------.
| javax.swing.JFrame-Konstruktor |
'--------------------------------'

Man kann sich vorstellen, daß man mit einer Klassendeklaration in Java  eigentlich zwei  Klassen spezifiziert: Eine „statische Klasse“ mit allen statischen Feldern und Methoden und eine „dynamische Klasse“ für Exemplare mit den nicht-statischen Feldern und Methoden. Diese beiden „Klassen“ sind durch gemeinsame Zugriffsrechte verbunden. Die statische Methode "main" gehört zu der „statischen Klasse“ "JFrame1", die dann ein Exemplar der „dynamischen Klasse“ "JFrame1" erzeugt. In dem vorherigen Abschnitt wurden dafür noch zwei getrennte Klassendeklarationen verwendet. Hier sieht man nun, daß beide „Klassen“ auch mit einer Klassendeklaration geschrieben werden können.

Von der Stefan-Ram-Startseite ausgehend finden sich oft noch mehr Informationen zu Themen, die auf einer Seite angesprochen wurden. (Eine Verbindung zur Stefan-Ram-Startseite befindet sich ganz oben auf dieser Seite.)  |   Netzpostadresse von Stefan Ram: "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen)   |   Seiteninformation und Impressum  |   Formular für diese Seite betreffende Mitteilungen an den Herausgeber  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. slrprd, PbclevtugFgrsnaEnz