Layoutmanager GridbagLayout ?

Ich versuche die ganze Zeit ein vernünftiges Layout für mein Applet hinzukriegen doch ich komme mit dem GridbagLayout net zurecht. Entweder fehlen Felder oder sie sind komisch angeordnet, vielleicht könnt ihr ja Licht in das Dunkel bringen.

Mein Layout soll so aussehen:

  1. Zeile: 1 Feld
  2. Zeile: 2 Felder
  3. Zeile: 2 Felder
  4. Zeile: 2 Felder
  5. Zeile: 1 Feld
  6. Zeile: 3 Felder
  7. Zeile: 2 Felder
  8. Zeile: 2 Felder
  9. Zeile: 3 Felder
  10. Zeile 1 Feld (aber 3mal so hoch wie die anderen Felder)

Die doofen GridBagConstrains rauben mir die nerven.
Was ich so halbwegs begriffen hab ist, das ein gridwidth.Reminder bedeutet die Zeile is nach dem Feld zuende.
Ein gridwidth.Relative bedeutet 2 Felder sind nebeneinander.
weightx ist der Abstand in x-Richtung, und weighty dann halt in y-Richtung.
gridheight ist die Höhe,aber dann wirds auch schon dunkel.

Wäre schön wenn mir jemand helfen könnte…
Gruß Sledge

Hi,

die Klasse GridBagConstraints hat 2 Konstruktoren. Der Standardkonstruktor initialisiert eine Instanz mit den Standardwerten.
Diese Werte kann man in der Javadoc finden. Der zweite Konstruktor ist der Interessantere.

GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady)

gridx - gibt die Spaltennummer an.
gridy - gibt die Zeilennummer an.
gridwidth - gibt die Ausdehnung der Zelle über die Spalten an. Entspricht dem colspan-Attribut in HTML Tabellen.
gridheight - gibt die Ausdehnung der Zelle über die Zeilen an. Entspricht dem rowspan-Attribut in HTML Tabellen.
weightx - gibt die Gewichtung an. Das bedeutet, dass wenn man einer Zelle A die Gewichtung 1.0 gibt und einer Zelle B 4.0 dann wird Zelle B 4 mal so breit wie Zelle A dargestellt.
weighty - gibt die Gewichtung in der Höhe an.
anchor - gibt die Ankerposition der Komponente an. Also ob diese in der Zelle zentriert werden soll oder am oberen Rand ausgerichtet wird usw. Die Werte werden erhält man über die Konstanten der GridBagConstraints Klass. Weiteres in der Javadoc.
fill - gibt an, ob die Komponente immer die größe der Zelle einnehmen soll. Normalerweise wird die Komponente in ihrer größe dargestellt. Setzt man fill aber auf GridBagConstraints.HORIZONTAL, GridBagConstraints.VERTICAL oder GridBagConstraints.BOTH dann wird die Komponente gestreckt.
insets - hier wird eine Referenz auf eine Instanz der Insets-Klasse übergeben. Mit dieser gibt man die Außernabstände der Komponente zur Zelle hin an.
ipadx - gibt die Breite der Komponente in Pixel an. Wird ignoriert, falls fill auf GridBagConstraints.HORIZONTAL oder GridBagConstraints.BOTH gesetzt ist.
ipady - gibt die Höhe der Komponente in Pixel an. Wird ignoriert, falls fill auf GridBagConstraints.VERTICAL oder GridBagConstraints.BOTH gesetzt ist.

Ich hoffe das hilft weiter.
Übrigens…
Auf meiner Webseite gibt es auch etwas über Java.
http://www.computer-link.de/view.php?topicID=3

Ahhhh, das bringt mich glaubich sehr viel weiter, vielen herzlichen Dank dafür!
Ich werde es gleich mal ausprobieren, eine deutsche Javadoc wäre mir manchmal echt hilfreich :wink:

Das Tutorial in deinem Link ist mir etwas zu speziell, aber trotzdem werde ich es mal in meine Linksammlung aufnehmen, danke.

Gruß Wizard of War

Ich habe da noch was für deine Link-Liste.
Ist zwar keine deutsche Javadoc aber auch Gold wert.

Schau dir mal
http://www.galileocomputing.de/openbook/javainsel3/
an.

PS: Gibt’s auch zum kostenlosen downloaden und bei galileocomputing
gibt es noch mehr openbooks. :wink:

Java ist auch eine Insel kenne ich schon als eBook, allerdings nur version 2.
Danke!
Ich habe es ausprobiert und nach ein bissel weiter rumprobieren gings dann auch halbwegs, allerdings finde ich es schade dass ich nicht einfach sagen kann:
Setze Button xyz an position (x,y) höhe 10 und breite 25.

Oder wie es bei Visual C++ ist einfach Drag & Drop.
So ist es ziemlich umständlich finde ich, aber ich glaube mit Java 1.5 soll das anders werden oder irre ich mich da (ich meine sowas in der Beschreibung von der Beta gelesen zu haben)?

Ach ja noch ein Problem ist dabei aufgetreten:
Ich benutze das Borderlayout und an der Rechten Border hab ich mein GridBaglayout drinne, nun habe ich leider eine Choice die ziemlich breit geworden ist, da der inhalt so groß ist. Wie kann ich eine fester Größe (breite) für das GridbagLayout festlegen oder für die Choice?
Ich hab schon versucht zuerst die Choice zu adden und dann den text einzufügen doch das brauchte auch nix. Ebenso brachte das Kommando setsize(x,y) keine abhilfe weder beim gesamten Gridbag noch bei der choice ansich, die ist immer zu breit :frowning:

Vielleicht kannst du mir ja auch da weiter helfen?

Gruß Wiz

Also …

du musst nicht bis Java 1.5 warten. Programmiere dir doch
einfach selber eine Klasse welche die Schnittstellen bietet die
du brauchst.

Zum Beispiel:

==================================================================
import javax.swing.*;
import java.awt.*;

public class TestFrame extends JFrame {

public TestFrame() {
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}

void jbInit() throws Exception {
GridBagLayoutPanel panel = new GridBagLayoutPanel();
panel.add(new Button(„Zeile0,Spalte0“), 0, 0);
panel.add(new Button(„Zeile0,Spalte1“), 1, 0);
panel.add(new Button(„Zeile1,Spalte1“), 1, 1, 150, 20);
this.getContentPane().add(panel, BorderLayout.EAST);
this.setSize(640,480);
}

public static void main(String[] args) {
TestFrame frame2 = new TestFrame();
frame2.setVisible(true);
}
}

class GridBagLayoutPanel extends JPanel {
public GridBagLayoutPanel(){
super.setLayout(new GridBagLayout());
}

public void add(Component comp, int column, int row){
this.add(comp, column, row, 0, 0);
}

public void add(Component comp, int column, int row, int width, int height){
this.add(comp, new GridBagConstraints(column, row, 1, 1, 1.0, 1.0,
GridBagConstraints.CENTER,
GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), width, height));
}

/**
* Überschrieben, damit man den LayoutManager nicht ändern kann.
* Sonst würde die Klasse ihre Bedeutung verlieren.
*/
public void setLayout(LayoutManager layout){
}
}

Zum nächsten Problem. Benutze JBuilderX in der Foundation Version ist
der soviel ich weiß kostenlos. Damit kannst du auch via Drag & Drop
GUIs erstellen. Selbstverständlich behälst du auch weiterhin die Kontrolle
über den Quelltext. Download auf www.borland.de -> Downloads -> JBuilder.
Die Version X ist derzeit nur in englisch verfügbar. Wenn du eine deutsche willst, lade dir Version 9 Personal herunter. Die ist auch kostenlos, aber nur für die private Nutzung.

Zum letzten wäre noch zu sagen, dass du die Größe der Komponente in
der GridBagConstrains Klasse angibst. Siehe Beispiel oben.

Hoffe das hilft wieder etwas weiter :smile:

Dein beispiel ist lustig, das sieht aus wie eben mal aus dem Ärmel geschüttelt, Respekt!
Mit Swing habch noch gar nicht gearbeitet, den JBuilder hatten wir mal in der Uni aber den fand ich soooooo umständlich und lahm, da blieb ich lieber bei meinem Proton3 *g*
Kann Eclypse sowas auch? Sobald ich mal jemanden mit breitband treffe darf der mir das dann runterladen (ich hab nur ne 28k Leitung :frowning: ).

Dein Posting muss ich erstmal Schritt für Schritt durcharbeiten und schauen ob ich davon was verstehe :wink:

Danke erstmal, Gruß Wiz

Alternative: TableLayout
Hallo,

ich fand das GridBagLayout auch immer etwas nervig und hab neulich folgende Alternativen entdeckt:

TableLayout:
http://www.clearthought.info/software/TableLayout/

Form Layout:
http://www.jgoodies.net/freeware/forms/index.html

Das erste ist recht einfach aber effektiv, mit dem zweiten hab ich mich noch nicht wirklich beschäftigt.

gruß
Heavy