BeanDev: GUI Beans, eigene Property-Editoren
In diesem dritten Teil geht es ans Eingemachte. Das farbenfrohe Klicken ist vorbei, es wird programmiert.
Im vorherigen Teil habe ich den BeanInfo-Editor vorgestellt und zu der JImagePanel-Klasse nur wenige Eigenschaften freigeschaltet.
Die zwei neuen Eigenschaften backgroundImage und appearance bieten aber nur einen Komfort von zweifelhaften Wert an. NetBeans bietet keinen Editor für ImageIcons an und schon gar nicht für die selbst programmierte Enumeration Appearance.
Ich fange mal mit Appearance an, weil ich dafür erstmal nur die Möglichkeiten von NetBeans ausschöpfen will. Da NetBeans (leider noch nicht) selbst enum-Klassen erkennt, muss ich selber ran und einen eigenen Editor dafür programmieren. Einmal geht es dafür noch in den Datei-Assistenten: Strg+N -> Kategorie "JavaBeans Objects" -> Property Editor. Name soll sein: "AppearancePropertyEditor". Die erzeugte Klasse ist klein und bietet nicht viel.
Nun wird folgendes in die Klasse programmiert:
package org.sepix.beandemo;
import java.beans.*;
import org.sepix.beandemo.JImagePanel.Appearance;
/**
* @author Aljoscha Rittner
*/
public class AppearancePropertyEditor extends PropertyEditorSupport {
@Override
public String[] getTags() {
return new String[] {"SCALE", "CENTER"};
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
String input = text != null ? text.toLowerCase() : "";
if ( input.equals("scale")) {
setValue(JImagePanel.Appearance.SCALE);
} else if ( input.equals("center")) {
setValue(JImagePanel.Appearance.CENTER);
} else {
setValue (null);
}
}
@Override
public String getJavaInitializationString() {
JImagePanel.Appearance app = (Appearance) getValue();
if ( app == null ) return "null";
switch (app) {
case SCALE: {
return "org.sepix.beandemo.JImagePanel.Appearance.SCALE";
}
case CENTER: {
return "org.sepix.beandemo.JImagePanel.Appearance.CENTER";
}
}
return "";
}
}
Was da passiert ist relativ einfach. Die Methode getTags() liefert alle möglichen "Human readable" Werte für appearance. Die Methode setAtText "übersetzt" diese Zeichenketten in echte Werte vom Typ JImagePanel.Appearance. Und letztendlich bastelt die Methode getJavaInitializationString() aus dem Wert einen Java-Befehl, der direkt in das Programm vom Form-Designer eingefügt wird.
Woher weiß nun NetBeans, dass ich nun einen neuen Editor für Appearance habe? Noch gar nicht. Dafür rufe ich wieder die Klasse JImagePanelBeanInfo auf, wechsele in den Desinger und markiere das Property appearence. Auf der rechten Seite kann ich nun die Eigenschaft "Property Editor Class" setzen. In meinem Fall ist das der Name: org.sepix.beandemo.AppearancePropertyEditor.class - es muss also der vollqualifizierte Name der Editor-Klasse sein (mit Package) und dem Anhängsel .class (das ist übrigens ein Pseudofeld der Java-Programmiersprache für Object-Klassen).
Nun erneut ein "Clean & Build" des Projektes. Das Test-JFrame öffnen und das alte JImagePanel rauslöschen und erneut über die Palette hinzufügen.
Und tatsächlich: appearance hat nun eine Combobox mit zwei Werten.
Wenn ich einen auswähle, wird im Guarded Block des Quelltextes auch der passende Programmbefehl eingefügt:
jImagePanel1.setAppearance(org.sepix.beandemo.JImagePanel.Appearance.CENTER);
Nur noch eine Sache stört mich. Das Property appearance zeigt zunächst immer null an. Wenn man aber JImagePanel anpasst und das Feld appearance initialisiert, dann ist das Problem auch verschwunden:
public class JImagePanel extends JPanel {
public static enum Appearance {SCALE, CENTER};
private ImageIcon backgroundImage;
public static final String PROP_BACKGROUNDIMAGE = "backgroundImage";
private Appearance appearance = Appearance.SCALE; // <- Standard
public static final String PROP_APPEARANCE = "appearance";
...
Super. Eine Eigenschaft haben wir schon auf die Sprünge geholfen. Nun geht es um das Hintergrundbild. Dazu mehr im nächsten Teil!
Teil 1 | Teil 2 | -> Teil 3 | Teil 4
Da werden Sie geholfen:
Das deutsche NetBeans Forum
![Validate my RSS feed [Valid RSS]](http://www.sepix.de/fileadmin/valid-rss.png)