ich habe für zwei Dateiauswahlen ein GridLayout, welches wie folgt
aufgebaut ist:
Label Textfield Button
Label Textfield Button
Das Problem ist, dass beim GridLayout die Zellen alle gleich groß sind.
Daher ist der Platz für das Textfeld entweder zu klein oder wenn ich
dies größer mache ist der Platz für die kurze Beschriftungen zu groß.
Wie müsste ich dies denn umstellen, sodass die Breite einer Spalte nur
vom größten Element innerhalb der Spalte abhängig ist und nicht von den
Elementen anderer Spalten? Geht das mit GridLayout oder brauch ich da
ein GridBagLayout? Wie müsste ich das GridBagLayout definieren?
das ganze sollte dann schematisch so aussehen:
Label Textfield Button
Label Textfield Button
Hier mal mein Quellcode wie ich es derzeit habe:
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 3));
panel.add(new JLabel("Source:"));
this.txtSource = new JTextField(8);
panel.add(this.txtSource);
JButton button = new JButton("Browse...");
button.addActionListener(
new FileChooserActionListener(this.txtSource,
new XmlFileFilter()));
panel.add(button);
panel.add(new JLabel("Config:"));
this.txtConfig = new JTextField(8);
panel.add(this.txtConfig);
JButton button = new JButton("Browse...");
button.addActionListener(
new FileChooserActionListener(this.txtConfig,
new XmlFileFilter()));
panel.add(button);
--
Mit freundlichen Grüßen,
Christoph Herrmann
Entweder du mischt (also z.b. noch nen panel in die Zellen, oder aber du
nimmst gleich das GridBagLayout.
Gruss
Bernd
In wie fern noch ein Panel in die Zellen? dadurch werden die Zellen aber
auch nicht kleiner oder flexibler.
GridBagLayout würde zwar gehen klar, aber ich wollte es nicht zu komplex
haben und erst mal schauen, ob es noch eine andere einfachere
Möglichkeit gibt.
> GridBagLayout würde zwar gehen klar, aber ich wollte es nicht zu komplex
> haben und erst mal schauen, ob es noch eine andere einfachere
> Möglichkeit gibt.
Gibt es. JGoodies FormLayout:
http://jgoodies.com/freeware/forms/index.html
(Ja, ich arbeite auch lieber erst mal nur mit JDK-Bordmitteln, aber in
diesem Fall lohnt sich die zusaetzliche Lib wirklich.)
Viele Gruesse,
Patrick
> Bernd Eckenfels schrieb:
>> Entweder du mischt (also z.b. noch nen panel in die Zellen, oder aber du
>> nimmst gleich das GridBagLayout.
>
> In wie fern noch ein Panel in die Zellen? dadurch werden die Zellen aber
> auch nicht kleiner oder flexibler.
>
> GridBagLayout würde zwar gehen klar, aber ich wollte es nicht zu komplex
> haben und erst mal schauen, ob es noch eine andere einfachere
> Möglichkeit gibt.
>
Hallo,
das GridBagLayout ist nicht wirklich komplex. Außer dem BorderLayoutManager
ist es eigentlich mein liebster L.Manager.
Zu Deinem Problem, der GridBagLayoutManager ist das Mittel Deiner Wahl. Du
kannst es aber auch mit dem für mich seltsamen neuen LayoutManager des
Mantisse-Editors einstellen wie du es haben möchtest.
Viele Grüße,
Werner
Ne, das wäre doch zu übertrieben. Das Projekt besteht aus zwei Teilen
und mein Teil umfasst ein Fenster mit ner handvoll Elementen. ;)
Trotzdem Thx.
Hab das GridBagLayout nun verwendet und es passt.
Du hast auch Recht, das Layout ist nicht schwer, man muss nur die
Parameter kennen, die man einstellen kann. :)
Dann vielleicht das Border Layout? Die Mitte passt sich der Fesnterbreite
an, und die festen Elemnte bekommen ihre minsize.
Gruss
Bernd
y
das wär noch nicht mal die schlechteste Idee. Klappt aber in dem Falle
nur weil der mittlere Teil sich mit vergrößern soll, wenn das Fenster
größer gezogen wird. :)
Aber hab es jetzt schon mit GridBagLayout gemacht, denke da hab ich mehr
Kontrolle, vor allem wenn der Dialog noch erweitert werden soll.
On 10 Mai, 19:21, Christoph Herrmann <herrm...@dragonprojects.de>
wrote:
> Hi,
> Wie müsste ich dies denn umstellen, sodass die Breite einer Spalte (...)
Alternative: Eigenen LayoutManager implementieren.
Da Du offensichtlich über eine wohldefinierte Mange von bekannten
Elementen anordnen willst, brauchst Du im addLayoutComponent nur zu
Prüfen, ob der Parameter aus der Menge ist (Sonst Exception). Damit
sicherst Du Dich vor späteren Missverständnissen.
Dann nur noch
void layoutContainer(Container parent)
Dimension minimumLayoutSize(Container parent)
Dimension preferredLayoutSize(Container parent)
implementieren, fertig.
Nach der Erfahrung des ersten LayoutManager ist das individuelle
Gestalten der Panels kein Problem mehr.
Bsp. (Hier aus meinem LayoutManager ProzentLayout):
/**
* Returns the preferred dimensions for this layout given the
components
* int the specified panel.
* @param parent the component which needs to be laid out
* @see #minimumLayoutSize
*/
public Dimension preferredLayoutSize(Container parent) {
Insets insets = parent.getInsets();
int ncomponents = parent.getComponentCount();
int w = Minimumx;
int h = Minimumy;
for (int i = 0 ; i < ncomponents ; i++) {
Component comp = parent.getComponent(i);
Dimension d = comp.getPreferredSize();
Rectangle r=getMyComponentRect(comp);
int hierw=(int)java.lang.Math.round((100* d.width )/
r.width);
int hierh=(int)java.lang.Math.round((100* d.height)/
r.height);
w = Math.max(w,hierw);
h = Math.max(h,hierh);
}
return new Dimension(Math.min(insets.left + insets.right + w
+2,Maximumx) ,
Math.min(insets.top + insets.bottom + h
+2,Maximumy) );
}
/**
* Returns the minimum dimensions needed to layout the components
* contained in the specified panel.
* @param parent the component which needs to be laid out
* @see #preferredLayoutSize
*/
public Dimension minimumLayoutSize(Container parent) {
Insets insets = parent.getInsets();
int ncomponents = parent.getComponentCount();
int w = Minimumx;
int h = Minimumy;
for (int i = 0 ; i < ncomponents ; i++) {
Component comp = parent.getComponent(i);
Dimension d = comp.getMinimumSize();
Rectangle r=getMyComponentRect(comp);
int hierw=(int)java.lang.Math.round((100* d.width )/
r.width);
int hierh=(int)java.lang.Math.round((100* d.height)/
r.height);
w = Math.max(w,hierw);
h = Math.max(h,hierh);
}
return new Dimension(Math.min(insets.left + insets.right + w
+2,Maximumx) ,
Math.min(insets.top + insets.bottom + h
+2,Maximumy) );
}
protected Rectangle getMyComponentRect(Component comp){
Rectangle r=new Rectangle(0,0,100,100);
// :TODO: Hier eigene Implemetierung in Prozent je nach
Element.
return r;
}
/**
* Lays out the container in the specified panel.
* @param parent the specified component being laid out
* @see Container
*/
public void layoutContainer(Container parent) {
Insets insets = parent.getInsets();
int ncomponents = parent.getComponentCount();
Rectangle r=null;
if (ncomponents == 0) {
return;
}
double w = parent.getSize().width - (insets.left +
insets.right);
double h = parent.getSize().height - (insets.top +
insets.bottom);
for (int i=0; (i < ncomponents); i++){
r=getMyComponentRect(parent.getComponent(i));
setComponentBoundsFor(parent.getComponent(i),
(int)java.lang.Math.round(insets.left+(r.x*w)/100),
(int)java.lang.Math.round(insets.top+(r.y*h)/100),
(int)java.lang.Math.round((r.width *w)/100-1),
(int)java.lang.Math.round((r.height*h)/100-1)
);
}
}
/**
* Setzt die Position und Größe einer Komponente ein (Benutzt
myC.setBounds(x,y,w,h))
* <BR>
* An sich langweilige Methode, kann aber überschrieben werden, um
z.B die größe eines Fonts anpassen zu können.
*/
public void setComponentBoundsFor(Component myC, int x, int y, int
w, int h){
myC.setBounds(x,y,w,h);
}
Danke für den Hinweis und vor allem das Beispiel, ich werde mir den mal
anschauen und ausprobieren. :) Aber aktuell für das Problem wäre es viel
zu Oversized. Mit dem GridBagLayouer bin ich ja zum Ziel gekommen. ;)
> Werner Hofmann schrieb:
>> das GridBagLayout ist nicht wirklich komplex. Außer dem
>> BorderLayoutManager ist es eigentlich mein liebster L.Manager.
>
> Hab das GridBagLayout nun verwendet und es passt.
>
> Du hast auch Recht, das Layout ist nicht schwer, man muss nur die
> Parameter kennen, die man einstellen kann. :)
>
Hallo Christoph,
der visuelle Editor in Netbeans hat mir damals sehr viel geholfen um den
BorderLayoutManager zu verstehen. Ich kann ihn wirklich sehr empfehlen.
Viele Grüße,
Werner
> das GridBagLayout ist nicht wirklich komplex. Außer dem BorderLayoutManager
> ist es eigentlich mein liebster L.Manager.
GridBagLayout (GBL) ist einer der schwächeren Layout-Manager.
Er beherrscht wenige der essentiellen Gestaltungsaufgaben.
Viele Entwickler finden den Umgang mit dem GBL kompliziert.
Das mag daran liegen, dass ein Mensch zum Lesen eines GBL-Layouts
zwei Durchgänge braucht, um die Gitterstruktur zu verstehen - ganz
so, wie das GBL selber.
In Layout-Kursen habe ich erlebt, wieviel leichter Entwickler
mit dem TableLayout arbeiten können, und über Layouts sprechen.
TableLayout definiert zuerst das Gitter (Spalten und Zeilen) und
füllt in einem zweiten Schritt in dieses Gitter Komponenten.
Der Aufwand zum Bauen eines mentalen Layouts hängt damit nicht
von der Anzahl der Komponenten ab. Das scheint eine gute Sache
für uns Menschen zu sein.
> [...]
-Karsten Lentzsch
Dann machst du 3 GridLayout's mit je 1 Spalte und packst diese in ein
BorderLayout - die Label nach WEST, die Button nach EAST und die Text-
felder in's CENTER. Du kannst Layouts beliebig tief verschachteln.
Aber die beste Lösung ist natürlich FormLayout von JGoodies. Es gibt
wohl etwas was du damit nicht hinbekommst. Das GBL ist etwas für
Suizidgefährdete.
Alfred