LayoutManager GridBagLayout Probleme

Sin137

Mitglied
Hallo liebe Community,

ich schreibe zurzeit ein Programm und verwende dabei das GridBagLayout.
Mein Problem liegt darin, das er es nicht so zeichnet wie ich will.

Java:
    public void createInputRight(JPanel right){
        add(right,"East");
        right.setBorder(new LineBorder(Color.BLUE));
        gbc = new GridBagConstraints();
        right.setLayout(new GridBagLayout());
      
        text = new JLabel("Produktinformationen");
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = 2;
        gbc.gridy = 0;
        gbc.gridx = 0;
        right.add(text,gbc);
      
//        ---------------------------------------------------------
      
        article = new JPanel();
        article.setLayout(new GridBagLayout());
        article.setBorder(new LineBorder(Color.BLUE));
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridheight = 2;
        right.add(article, gbc);
      
        text = new JLabel("Artikel");
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        article.add(text, gbc);
      
        text = new JLabel("Beispiel");
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 1;
        article.add(text, gbc);
      
//        ---------------------------------------------------------
      
        size = new JPanel();
        size.setLayout(new GridBagLayout());
        size.setBorder(new LineBorder(Color.BLUE));
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 1;
        gbc.gridy = 1;
        right.add(size,gbc);
      
        text = new JLabel("Größe");
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        size.add(text,gbc);
      
//        ---------------------------------------------------------
        price = new JPanel();
        price.setLayout(new GridBagLayout());
        price.setBorder(new LineBorder(Color.BLUE));
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 1;
        gbc.gridy = 2;
        right.add(price,gbc);
      
        text = new JLabel("Preis");
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        price.add(text, gbc);
      
    }


Anzeigen tut er es mir so:



Ich will es aber ungefähr so (Skizze):




ich hoffe es ist verständlich was ich meine =)
 
probier anstelle der einzelen adds mal über eine methode

Code:
/**
     * Interne Methode zum hinzufügen der einzeln Componenten auf das Panel
     * @param gbc GridBagConstraints
     * @param c Component to add
     * @param gridx Colum
     * @param gridy Row
     * @param width count of Colums
     * @param height count of Rows
     * @param weightx percent of the colum for the Component
     * @param weighty percent of the row for the Component
     * @param fill fill orientation
     */
    private void addComponent( GridBagConstraints gbc, Component c, int gridx, int gridy, int width, int height,
                               double weightx, double weighty, int fill){
        gbc.gridx      =gridx;    gbc.gridy     =gridy;
        gbc.weightx    =weightx;  gbc.weighty   =weighty;
        gbc.gridheight =height;   gbc.gridwidth =width;
        gbc.fill =fill;
        add( c, gbc);
    }
 
Danek für die schnelle Antwort, sofern ich es richtig verstanden habe muss man nicht immer alle Parameter belegen, würde ich es über deine Methode bedienen, dann schon. Die Methode jetzt xy-Mal mit verschiedenen Parametern zu schreiben ist der Aufwand glaub ich nicht wert.

Wie ist es denn standartmäßig ? Sind die werte 0/null ?
Was ich deiner Methode in meinem Fall hinzugefügt habe, ist ein parameter, der das Objekt mitliefert, wo das Element eingefügt wird.
 
Man braucht nicht immer alle Werte für das GridBagConstraint Objekt angeben. Wenn man z.B. das Gitter Layout Spaltenweise füllen möchte, kann man ein mal gbc.gridx=0 sagen und danach legiglich gbc.gridy=0, gbc.gridy=1, gbc.gridy=2 etc schreiben. Das gridx=0 gilt also solange bis es mit einem anderen Wert überschrieben wird (z.B. gbc.gridx=1 für die nächste Spalte). Man verbessere mich, wenn ich was falsches erzähle. So habe ich es zumindest in Erinnerung.

Ich vermute also, dass dein: gbc.gridwidth=2 der Verursacher deiner Probleme sein könnte. Denn dieser Wert wird nur einmal definiert und dann nicht wieder zurück gesetzt. Folglich müssten alle Elemente, die mit diesem gbc ge'added wurden eine Spaltenbreite von '2' haben. Und danach sieht es für mich auch auf dem Bild aus.
 
@X5-599 ich habe das auch so im kopf gridx=spalte gridy=Zeile
deshalb mach ich das mit der Methode, dann sehe ich immer wo ich welches ding hinpflanze und muss nicht immer jede einzelne Component hinzufügen.

besonders gut ist das dann bei schleifen, wenn man JTextField[] oder JLabel[] hat
 
Also nach längerem ausprobieren und werten ändern habe ich nun die Lösung. Der ansatz mit der Methode ist sehr schön (ganz im Sinne von der OOP)

Ist mir auf jeden Fall eine große Hilfe und Zeitersparnis, in sofern danke ich der recht Herzlich!

Der grobe Fehler lag aber denke ich einfach daran, dass ich mich einfach noch nicht so gut mit der Positionierung der Elemente auskannte.

Durch Testklassen habe ich gelernt, welche Angbane ich machen muss, um welches Element an gewünschter Stelle zu Platzieren.


Mit freundlichen Grüßen

Sin
 

Neue Themen


Zurück
Oben