Discussion:
Dialoggröße automatisch anpassen beim Hinzufügen von Buttons
(zu alt für eine Antwort)
Robert Schneider
2004-08-05 11:06:50 UTC
Permalink
Hi Forum,

Ich habe ein JDialog, darauf sind mehrere JPanels, wobei nur einer jetzt
interessant ist. Auf diesem einen Panel sind mehrere Komponenten
untergebracht - sagen wir der Einfachheit halber es sind 5 Buttons
untereinander auf diesem JPanel angebracht. So - jetzt einmal pack()
ausgeführt und alles sieht schön ordentlich aus. Jetzt möchte ich während
der Laufzeit einen weiteren Button hinzufügen - auch wieder der
Einfachheit halber unterhalb der anderen 5 Buttons. Was ich dann möchte
ist, dass sich der JDialog jetzt automatisch um den einen Button in der
Höhe vergrößert, so dass dieser schön sichtbar ist. Allerdings (sonst wäre
es ja auch zu einfach) möchte ich jetzt nicht wieder ein pack() ausführen,
da die möglicherweise vom Benutzer eingestellte Breite erhalten bleiben
soll (mit der Maus resized).

Was auch noch in Ordnung wäre, und damit es nicht zu unnötigen
Hässlichkeiten kommt, ist dass zumindestens für das Panel eine minimale
Größe eingestellt werden kann. Beim verwendeten GridBagLayout für dieses
Panel scheint aber die setMinimumSize irgendwie keine Wirkung zu haben.
Das checke ich auch nicht so richtig. Wäre aber gut, wenn das eingerichtet
werden könnte.

Wie bekomme ich das jetzt hin, dass der JDialog automatisch sein Höhe
anpasst? Was den LayoutManager betrifft, so habe ich das schon so weit
hinbekommen. Die Position des neuen Buttons wäre theoretisch richtig. Mit
dem hat das aber meines Erachtens auch nicht direkt etwas zu tun, oder
doch? Muss ich das mit Events lösen?

Hoffe, mir kann da jemand helfen.

Danke,
Robert
Andre Bialojahn
2004-08-05 12:12:01 UTC
Permalink
x-no-archive: yes
Post by Robert Schneider
Hi Forum,
Ich habe ein JDialog, darauf sind mehrere JPanels, wobei nur einer
jetzt interessant ist.
[...]
Was ich dann möchte ist, [Höhenanpassung bei Beibehaltung der
möglicherweise veränderten Breite].
Was auch noch in Ordnung wäre, und damit es nicht zu unnötigen
Hässlichkeiten kommt, ist dass zumindestens für das Panel eine
minimale Größe eingestellt werden kann. Beim verwendeten
GridBagLayout für dieses Panel scheint aber die setMinimumSize
irgendwie keine Wirkung zu haben.
JDialog ist von AWT.Dialog abgeleitet. Die AWT-Komponenten kennen
leider die [g|s]et[Maximum|Minimum|Preferred]Size() nicht.
Ohne explizites setSize() kommst Du da wohl nicht weiter. Und - so
las ich hier - sobald man ein Mal per setSize() eine Größe vorgege-
ben habe, hebele man damit nachfolgende Layoutversuche aus. Ob da
etwas dran ist, weiß ich nicht wirklich.
Post by Robert Schneider
Das checke ich auch nicht so richtig. Wäre aber gut, wenn das
eingerichtet werden könnte.
Wie bekomme ich das jetzt hin, dass der JDialog automatisch sein
Höhe anpasst?
Hmmm. Ich würde das hier versuchen, ohne zu wissen, ob es klappt:
Vorher die Größe in eine Dimension holen, dann pack()en lassen (paßt
Dir die Länge an), nochmal die aktuelle Größe in eine Dimension holen
und hinterher die vorige Breite von Hand restaurieren.
Post by Robert Schneider
Was den LayoutManager betrifft, so habe ich das schon so weit
hinbekommen. Die Position des neuen Buttons wäre theoretisch
richtig. Mit dem hat das aber meines Erachtens auch nicht direkt
etwas zu tun, oder doch? [...]
Nach meinem Verständnis: nur begrenzt. "AWT gegenüber JFC" scheint
mir das Problem zu sein. Vielleicht kann ja jemand anderes noch etwas
mehr Licht in die Sache bringen.
Post by Robert Schneider
Hoffe, mir kann da jemand helfen.
Ich weiß es nicht. Sag' Du es mir.

André
Robert Schneider
2004-08-05 13:15:03 UTC
Permalink
Post by Andre Bialojahn
JDialog ist von AWT.Dialog abgeleitet. Die AWT-Komponenten kennen
leider die [g|s]et[Maximum|Minimum|Preferred]Size() nicht.
Ohne explizites setSize() kommst Du da wohl nicht weiter. Und - so
las ich hier - sobald man ein Mal per setSize() eine Größe vorgege-
ben habe, hebele man damit nachfolgende Layoutversuche aus. Ob da
etwas dran ist, weiß ich nicht wirklich.
Also muss ich den Dialog selbst resizen. Ist ja in Ordnung. Aber was oder
womit wird dieser Vorgang gestartet (Event? Welches?) Und woher bekomme
ich die benötigte Gesamtgröße. Neben dem einen besprochenen Panel gibt es
noch weitere darunter, die aber eher statisch sind.

Das das Layouten dann nicht mehr gehen soll kann ich mir eigentlich nicht
so richtig vorstellen. Könnte jetzt nicht nachvollziehen warum. Aber ich
bin auch kein Experte. Ich denke, ich brauche doch nur mal validate
aufrufen, dann sollte wieder alles im Lot sein.
Post by Andre Bialojahn
Vorher die Größe in eine Dimension holen, dann pack()en lassen (paßt
Dir die Länge an), nochmal die aktuelle Größe in eine Dimension holen
und hinterher die vorige Breite von Hand restaurieren.
Hm... naja, eigentlich wollte ich ja kein wörkeraund. Wollte eher
versuchen zu verstehen und dazuzulernen.


Danke erstmal für deine Anregungen. Schreibe doch nochmal, wenn dir was
dazu einfällt.

Robert
Frank Dreyer
2004-08-06 19:08:54 UTC
Permalink
Post by Andre Bialojahn
JDialog ist von AWT.Dialog abgeleitet. Die AWT-Komponenten kennen
leider die [g|s]et[Maximum|Minimum|Preferred]Size() nicht.
java.awt.Dialog ist auch von java.lang.Object abgeleitet. Die Object-Klasse
kennt leider die add() Methoden nicht - trotzdem kann man dem Dialog
Komponenten hinzufügen. Das ist ja gerade der Sinn einer Subklasse, daß man
die Funktionalitäten der Oberklasse erweitert.
Post by Andre Bialojahn
Ohne explizites setSize() kommst Du da wohl nicht weiter. Und - so
las ich hier - sobald man ein Mal per setSize() eine Größe vorgege-
ben habe, hebele man damit nachfolgende Layoutversuche aus. Ob da
etwas dran ist, weiß ich nicht wirklich.
Hab den Quellcode nicht mehr im Kopf, aber AFAIK geht's da nur um die
preferred/minimum size. Wenn die null ist, wird der layoutmanager
beauftragt, die zu berechnen, ansonsten die vom benutzer gesetzte
zurückgegeben.
Post by Andre Bialojahn
Post by Robert Schneider
Wie bekomme ich das jetzt hin, dass der JDialog automatisch sein
Höhe anpasst?
spontan würde ich sagen dialog.setSize(new Dimension(dialog.getWidth(),
dialog.getPreferredSize().getHeight())). Ggf. noch auf null prüfen und/oder
revalidate() aufrufen. Wenn das nicht klappt, die Variante von Andre -
breite speichern, pack(), breite wieder setzen. Dann "zuckt" der Dialog u.U.
allerdings, da du die Breite zweimal änderst.
Andre Bialojahn
2004-08-07 12:31:33 UTC
Permalink
x-no-archive: yes
Post by Frank Dreyer
Post by Andre Bialojahn
JDialog ist von AWT.Dialog abgeleitet. Die AWT-Komponenten kennen
leider die [g|s]et[Maximum|Minimum|Preferred]Size() nicht.
java.awt.Dialog ist auch von java.lang.Object abgeleitet. Die
Object-Klasse kennt leider die add() Methoden nicht - trotzdem kann
man dem Dialog Komponenten hinzufügen. Das ist ja gerade der Sinn
einer Subklasse, daß man die Funktionalitäten der Oberklasse
erweitert.
Richtig. Das bleibt aber bei JDialog - sehr zu meinem Bedauern -
aus. Ich habe hier immer ein wildes Gefrickel mit der Größenzuweisung
und wenn ich nach einem .getContentPane().add(Komponente) dann mein
.pack() aufrufe, kriege ich ein niedliches, kleines Fenster, das ich
von Hand resizen darf, um den Inhalt zu sehen.
Dialog.setSize( $Komponentengröße ) geht auch nicht, weil dann ein
paar (viele) Pixel der enthaltenen Komponente abgeschnitten werden;
der Zuschlag für die Titelzeile des Dialogs entfällt dabei.
Abseits von händischem Addieren irgendwelcher obskurer Terme, die
"halt irgendwie so viele Pixel haben könnten, wie wohl die Titel-
zeile hoch ist" habe ich da noch keine Lösung gefunden. Alles sehr
unschön.

Hmmm - da sehe ich gerade an meinem eben erstellten Testcode, daß
ein einfaches "JDialog.setSize(JDialog.getPreferredSize())" bereits
funktioniert. *gnagh*
Vielleicht hätte ich mich doch nicht von der Abwesenheit der
setPreferredSize() irritieren lassen und etwas genauer in die
API schauen sollen.
Zumindest für die initiale Größenfindung taugt das.
Post by Frank Dreyer
Wenn das nicht klappt, die Variante von Andre - breite speichern,
pack(), breite wieder setzen. Dann "zuckt" der Dialog u.U.
allerdings, da du die Breite zweimal änderst.
Ja, das ist halt der Nachteil dieser Methode.
Wenn man sie zwischendurch unsichtbar macht, bekommt man immerhin
das Zucken nicht mehr mit - wenn einen das Blitzen dann nicht stört.
;-)

André
Frank Dreyer
2004-08-08 14:26:02 UTC
Permalink
Post by Andre Bialojahn
und wenn ich nach einem .getContentPane().add(Komponente) dann mein
.pack() aufrufe, kriege ich ein niedliches, kleines Fenster, das ich
von Hand resizen darf, um den Inhalt zu sehen.
[...]
Hmmm - da sehe ich gerade an meinem eben erstellten Testcode, daß
ein einfaches "JDialog.setSize(JDialog.getPreferredSize())" bereits
funktioniert. *gnagh*
Das wäre sehr seltsam, denn neben addNotify() & co ruft die pack() Methode
auch genau das auf. Rufst du vielleicht nach dem pack() aufruf noch irgendwo
setSize() auf? Oder hast du irgendwelchen Komponenten manuell zu kleine
preferredSize's zugeteilt?

Stefan Matthias Aust
2004-08-05 19:40:15 UTC
Permalink
Post by Robert Schneider
Wie bekomme ich das jetzt hin, dass der JDialog automatisch sein Höhe
anpasst?
Nochmal pack() aufrufen?


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Loading...