Swing: Erzeugen von eigenen GUI-Elementen in Subklassen von JPanel

Olel

Grünschnabel
Hallo zusammen,

da ich mich selbst nicht mit dem Swing-Framework auskenne, hoffe ich hier eine Antwort auf eine Frage zu bekommen, die im Rahmen einer Sun(!)-Schulung ungeklärt blieb.

In einem Schulungs-Beispiel wurde eine kleine GUI-Anwendung geschrieben. In dieser wurde eine Klasse A angelegt, die von JPanel erbt, sowie eine weitere Klasse B, die wiederum von A erbt.

Im Konstruktor von A wird die abstrakte Methode A#addComponents() aufgerufen, die von B implementiert wird. Es kam wie es kommen musste, in B#addComponents() wurde auf eine Objektvariable von B zugegriffen, die bei Instanzieren der Klasse A noch nicht initialisiert war und das Ergebnis war eine NullPointerException.

Die Teilnehmer der Schulung wiesen den Schulungsleiter dann darauf hin, dass es generell ein schlechtes Design ist, wenn aus einem Konstruktor nicht finale (oder abstrakte) Methoden aufgerufen würden.

Es stellt sich nun die Frage wie man das besser löst. Im SWT-Framework gibt es ja typischerweise eine Methode createContents() o.ä., die man in der abgeleiteten Klasse überschreibt und die dann vom Framework zur richtigen Zeit (aber eben nicht aus dem Konstruktor) aufgerufen wird. Wie würde man bei Swing vorgehen?

Danke im Voraus,
Ole
 
Hallo,

ich bin mir nicht sicher ob ich es richtig verstanden hab. Könntest du vielleicht das Beispiel mal posten?

MFG

Sascha
 
Hallo,

ich habe das Beispiel hier mal vereinfacht:

Code:
public abstract class A extends JPanel{

	public A()
	{
		addComponents();
	}

	protected abstract void addComponents();



public class B extends A {
	
	JTextField field = null;
	
	public B() {
		super();
		field = new JTextField();
	}

	@Override
	protected void addComponents() {
		// tue etwas mit field
	}
}

Wenn wie hier geschehen nun B#addComponents() aufgerufen wird (wie im Konstruktor von A definiert), gibt es eine NullPointerException, da field noch nicht initialisiert ist.

Es ist in diesem Beispiel natürlich auch total unlogisch das so zu designen. Das reale Beispiel ist natürlich etwas komplexer.

Die Frage ist aber halt auch im Allgemeinen wie man sowas in Swing löst. Gibt es etwas Vergleichbares wie die createContents() Methode in SWT?
 
Zurück