Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[JGoodies FormLayout] DefaultFormBuilder addSeparator() klappt nicht

32 views
Skip to first unread message

Stefan Prange

unread,
Sep 13, 2003, 2:34:58 PM9/13/03
to
Hi,

ich hab ein kleines Problem mit dem FormLayout aus Karstens JGoodies.
Ich verwende die letzte Release des Layouts, nämlich 1.0.1.

Ich finde den DefaultFormBuilder sehr bequem. Nur leider scheint beim
ihm das Hinzufügen eines Separators fehlerhaft implementiert zu sein.

Hier ein Ausschnitt aus meinem Code:

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
...
formLayout = new FormLayout(
"right:pref, 4dlu, left:pref:none, 4dlu, right:pref, 4dlu,
left:pref:none", // columns
""); // add rows dynamically
JPanel pnlFirma = new JPanel();
DefaultFormBuilder builder = new DefaultFormBuilder(pnlFirma,formLayout);

builder.setLineGapSize(Sizes.dluX(2));

builder.append(this.chkFirma, 3);
builder.nextLine();
builder.addSeparator("Kontaktperson"); // <-- FEHLER
builder.nextLine();
builder.append(this.lblFirmaAnrede, this.cboFirmaAnrede );
builder.nextLine();
...
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*


Die markierte Zeile (FEHLER) wirft folgende Exception:
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
...
java.lang.IndexOutOfBoundsException: The row index 2 must be less than
or equal to 1.
at
com.jgoodies.forms.layout.CellConstraints.ensureValidGridBounds(CellConstraints.java:521)
at com.jgoodies.forms.layout.FormLayout.setConstraints(FormLayout.java:552)
at
com.jgoodies.forms.layout.FormLayout.addLayoutComponent(FormLayout.java:760)
at java.awt.Container.addImpl(Container.java:664)
at java.awt.Container.add(Container.java:518)
at
com.jgoodies.forms.builder.AbstractFormBuilder.add(AbstractFormBuilder.java:436)
at
com.jgoodies.forms.builder.PanelBuilder.addSeparator(PanelBuilder.java:269)
at
com.jgoodies.forms.builder.PanelBuilder.addSeparator(PanelBuilder.java:295)
at
com.jgoodies.forms.builder.PanelBuilder.addSeparator(PanelBuilder.java:305)
...
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Ist das mein Fehler oder hab ich einen Bug gefunden?

Ich wollte dieses Problem eigentlich in das Diskussionsforum des
JGoodies-Projektes auf java.net posten, um Karsten gezielter
anzusprechen, aber leider hab ich nirgends einen Button zum Posten
gefunden (siehe mein vorheriges Posting in dclj).

Stefan

Stefan Prange

unread,
Sep 13, 2003, 2:43:22 PM9/13/03
to
Stefan Prange schrieb:

> builder.addSeparator("Kontaktperson"); // <-- FEHLER

Hat sich erledigt.
Wenn ich
builder.appendSeparator("Kontaktperson");
^^^^^^
schreibe, klappt es.

Allerdings sollte die Methode "addSeparator" gefixt, versteckt oder entfernt werden.

Stefan

Karsten Lentzsch

unread,
Sep 13, 2003, 6:29:07 PM9/13/03
to
Stefan Prange schrieb:

> formLayout = new FormLayout(
> "right:pref, 4dlu, left:pref:none, 4dlu, right:pref, 4dlu,
> left:pref:none", // columns
> ""); // add rows dynamically
> JPanel pnlFirma = new JPanel();
> DefaultFormBuilder builder = new DefaultFormBuilder(pnlFirma,formLayout);
>
> builder.setLineGapSize(Sizes.dluX(2));
>
> builder.append(this.chkFirma, 3);
> builder.nextLine();
> builder.addSeparator("Kontaktperson"); // <-- FEHLER

Der DefaultFormBuilder bietet mehr als der PanelBuilder,
vor allem, dass er Zeilen zufügt - wenn nötig.
Dazu ist der Satz von #appendXXX Methoden da.

Wie du gemerkt hast, hast du den Trennstrich
mit einer #addXX- Methode zufügen wollen,
die voraus setzt, dass die Gitterzeile schon da ist.

Hier noch ein paar Anmerkungen zu deinem Code:
1) Statt "left:pref:none" kannst du "left:pref" schreiben;
das "none" ist unnötig, hebt die Situation aber hervor.

2) Die Konstruktoren vieler Builder können ein
JPanel implizit erzeugen und arbeiten dann darauf.
Du kannst also kürzer schreiben:
new DefaultFormBuilder(formLayout);
Das Panel erhälst du mittels: builder.getPanel()

3) "Sizes.dluX(2)" kannst du ersetzen durch Sizes.DLUX2
Alternativen sind logische Größen, etwa:
FormFactory.NARROW_LINE_GAP_ROWSPEC und
FormFactory.LINE_GAP_ROW_SPEC.
Der DefaultFormBuilder ist mit dem letzten initialisiert.

Beste Grüße,
Karsten


Karsten Lentzsch

unread,
Sep 13, 2003, 6:41:37 PM9/13/03
to
Stefan Prange schrieb:

> Allerdings sollte die Methode "addSeparator"
> gefixt, versteckt oder entfernt werden.

Der DefaultFormBuilder besitzt zwei Methodensätze:
#addXXX aus dem AbstractFormBuilder und
#appendXXX, die er selber implementiert.

Das kann verwirren - und tut es auch. Ich habe
selbst auf den ersten Blick nicht gesehen, woher
dein Problem kam.

Ich halte die #addXX-Methoden allerdings für
so wichtig, dass ich sie sie nicht entbehren kann.
Wenn ein großes Layout überwiegend mittels
#append gebaut werden kann, aber eine Außnahme
drin ist, dann passiert es, dass man per Hand
Zeilen zufügt oder #addXXX-Methoden braucht.

Die Builder und gerade der DefaultFormBuilder
reflektieren "nur" meine Art, Panel zu bauen.
Ich will nicht in die Irre leiten und brauche deshalb
Rückmeldungen, wo ihr gestolpert seid, was unklar
oder schwierig ist, wo man's besser machen kann.

Die Builder sollen helfen - und nie behindern.
Vielleicht kommt ihr mit anderen Builder schneller,
einfacher und kürzer ans Ziel. Probiert das bitte aus;
gerne erfahre ich, wozu ihr gekommen seid.

Ich wollte mit den Buildern im Wesentlichen eins:
ein Muster etablieren, wie man Layout-Manager
ansteuern und Aufgaben trennen kann.

Beste Grüße,
Karsten


0 new messages