Angehängtes Layout, aber wie?

editOr

Mitglied
Hallo

Ich bin mir gerade am Überlegen wie ich angehängtes Layout erreichen kann. Das Problem besteht darin, dass ich nicht weiss, wie ich die beiden kleinen Buttons (auf der gleichen Höhe) wie die grossen platzieren kann, dass die grossen Buttons weiterhin zentriert sind.

Kann mir da jemand einen Gedankenanstoss liefern?


Besten Dank,
editor
 

Anhänge

  • bsp.png
    bsp.png
    3,1 KB · Aufrufe: 52
Hallo,

ich hätte folgende Lösung anzubieten.

Grundsätzlich eine eher wirre Verschachtelung von Panels mithilfe von Grid-, Border- und FlowLayout.

Aber das Ergebnis wäre wie auf deinem Bild.

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.*;


public class Gui {

	void los(){
		
		JFrame f = new JFrame();
		f.setSize(800, 600);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLocationByPlatform(true);
		
		// Panel erzeugen
		JPanel northPanel = new JPanel();
		JPanel centerPanel = new JPanel();
		JPanel leftPanel = new JPanel();
		JPanel middlePanel = new JPanel();
		JPanel rightPanel = new JPanel();
		JPanel innerRightPanel = new JPanel();
		
		// Obere und untere Panel hinzufügen
		f.add(BorderLayout.CENTER, centerPanel);
		f.add(BorderLayout.NORTH, northPanel);
		
		northPanel.setLayout(new GridLayout());
		// 3 Panel beim oberen Panel hinzufügen
		northPanel.add(leftPanel);
		northPanel.add(middlePanel);
		northPanel.add(rightPanel);
		
		JButton bigButton1 = new JButton("BigButton1");
		JButton bigButton2 = new JButton("BigButton2");
		bigButton1.setPreferredSize(new Dimension(100,100));
		bigButton2.setPreferredSize(new Dimension(100,100));
		
		middlePanel.add(bigButton1);
		middlePanel.add(bigButton2);

		JButton smallButton1 = new JButton("SmallButton1");
		JButton smallButton2 = new JButton("SmallButton2");
		
		rightPanel.setLayout(new BorderLayout());
		rightPanel.add(BorderLayout.SOUTH, innerRightPanel);
		innerRightPanel.add(smallButton1);
		innerRightPanel.add(smallButton2);
		
		f.setVisible(true);
		
	}
}
 
Vielen Dank

Ein Problem das bei dieser Variante auftaucht ist, dass, wenn ich nun mehr als nur 2 Grosse Buttons verwende sagen wir 6 Stk, durch das GridLayout alle 3 Bereiche gleich breit sein müssen. Der Versuch, deshalb das Gridlayout durch ein BorderLayout zu ersetzen scheitert daran, dass das "West" Panel leer ist und daher die Zentrierung kaputt geht.

Mit GridBagLayout sollte das wohl gehen, wobei ich dann das relative Gewicht für die Breite wohl jeweils berechnen müsste, frage mich, obs auch einfacher geht. Bin froh um Inputs, wenn dem so ist.

Besten Dank
editOr
 
Zuletzt bearbeitet:
Vielen Dank für die Hinweise

Leider schaffe ich es auch mit dem GridBagLayout nicht. Folgender Code liefert leider nicht das gewünschte Ergebnis.

Warum ist das leftPanel hier kleiner als das rightPanel trotz gleicher weightx?


Code:
import java.awt.BorderLayout;
 
public class Gui {
 
    static void los(){
        
        JFrame f = new JFrame();
               
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationByPlatform(true);
        
        // Panel erzeugen
        JPanel northPanel = new JPanel();
        JPanel centerPanel = new JPanel();
        JPanel leftPanel = new JPanel();
        JPanel middlePanel = new JPanel();
        JPanel rightPanel = new JPanel();
        JPanel innerRightPanel = new JPanel();
        
        // Obere und untere Panel hinzufügen
        f.add(BorderLayout.CENTER, centerPanel);
        f.add(BorderLayout.NORTH, northPanel);
        
        Border border = BorderFactory.createLineBorder(Color.RED);
        leftPanel.setBorder(border);
        middlePanel.setBorder(border);
        rightPanel.setBorder(border);

        
        northPanel.setLayout(new GridBagLayout());
        // 3 Panel beim oberen Panel hinzufügen
        
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx=0.2;
        northPanel.add(leftPanel, c);
        
        c.weightx=0.6;
        northPanel.add(middlePanel, c);
        
        c.weightx=0.2;
        northPanel.add(rightPanel, c);
        
        JButton bigButton1 = new JButton("BigButton1");
        JButton bigButton2 = new JButton("BigButton2");
        bigButton1.setPreferredSize(new Dimension(100,100));
        bigButton2.setPreferredSize(new Dimension(100,100));
        
        middlePanel.add(bigButton1);
        middlePanel.add(bigButton2);
 
        JButton smallButton1 = new JButton("SmallButton1");
        JButton smallButton2 = new JButton("SmallButton2");
        
        rightPanel.setLayout(new BorderLayout());
        rightPanel.add(BorderLayout.SOUTH, innerRightPanel);
        innerRightPanel.add(smallButton1);
        innerRightPanel.add(smallButton2);
        
        f.setVisible(true);
        
    }
    
    public static void main(String[] args) {
		Gui.los();
	}
}
 
Steh grad aufm Schlauch. Was meinst du damit?

Setzen von gridx und gridy führt leider auch nicht zum erfolg.

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;
 
public class Gui {
 
    static void los(){
        
        JFrame f = new JFrame();
               
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationByPlatform(true);
        
        // Panel erzeugen
        JPanel northPanel = new JPanel();
        JPanel centerPanel = new JPanel();
        JPanel leftPanel = new JPanel();
        JPanel middlePanel = new JPanel();
        JPanel rightPanel = new JPanel();
        JPanel innerRightPanel = new JPanel();
        
        // Obere und untere Panel hinzufügen
        f.add(BorderLayout.CENTER, centerPanel);
        f.add(BorderLayout.NORTH, northPanel);
        
        Border border = BorderFactory.createLineBorder(Color.RED);
        leftPanel.setBorder(border);
        middlePanel.setBorder(border);
        rightPanel.setBorder(border);

        
        northPanel.setLayout(new GridBagLayout());
        // 3 Panel beim oberen Panel hinzufügen
        
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx=0.2;
        c.gridx = 0;
        c.gridy = 0;
        northPanel.add(leftPanel, c);
        
        c.weightx=0.6;
        c.gridx = 1;
        c.gridy = 0;
        northPanel.add(middlePanel, c);
        
        c.weightx=0.2;
        c.gridx = 2;
        c.gridy = 0;
        
        northPanel.add(rightPanel, c);
        
        JButton bigButton1 = new JButton("BigButton1");
        JButton bigButton2 = new JButton("BigButton2");
        bigButton1.setPreferredSize(new Dimension(100,100));
        bigButton2.setPreferredSize(new Dimension(100,100));
        
        middlePanel.add(bigButton1);
        middlePanel.add(bigButton2);
 
        JButton smallButton1 = new JButton("SmallButton1");
        JButton smallButton2 = new JButton("SmallButton2");
        
        rightPanel.setLayout(new BorderLayout());
        rightPanel.add(BorderLayout.SOUTH, innerRightPanel);
        innerRightPanel.add(smallButton1);
        innerRightPanel.add(smallButton2);
        
        f.setVisible(true);
        
    }
    
    public static void main(String[] args) {
		Gui.los();
	}
}
 
Habe mir den betroffenen Teil in der FAQ nun zu Gemüte geführt, kann aber leider keine Lösung für das Problem entdecken...

Möglicherweise hat es mit dem hier zu tun.

Auch schön zu sehen ist, wie das GridBagLayout diese Einstellung umgehen kann wenn es Platzprobleme gibt. Dann versucht das GridBagLayout jeder Component zumindest eine minimale Grösse zu geben:

Allerdings besteht das Problem auch, wenn das Fenster gross ist und die Minimalgrösse kein Problem sein sollte.

Wäre froh um weitere Hinweise.
 
Das ist richtig, aber sowas wird im Allgemeinen nicht gemacht.

Lösungsvariante:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import java.awt.event.*;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;

public class Gui implements ComponentListener {
    private JPanel leftPanel, rightPanel;

    public Gui(){

        JFrame f = new JFrame();
        f.addComponentListener(this);

        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationByPlatform(true);

        // Panel erzeugen
        JPanel northPanel = new JPanel();
        JPanel centerPanel = new JPanel();
        leftPanel = new JPanel();
        JPanel middlePanel = new JPanel();
        rightPanel = new JPanel();
        JPanel innerRightPanel = new JPanel();

        // Obere und untere Panel hinzufügen
        f.add(BorderLayout.CENTER, centerPanel);
        f.add(BorderLayout.NORTH, northPanel);

        Border border = BorderFactory.createLineBorder(Color.RED);
        leftPanel.setBorder(border);
        middlePanel.setBorder(border);
        rightPanel.setBorder(border);


        northPanel.setLayout(new GridBagLayout());
        // 3 Panel beim oberen Panel hinzufügen

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx=0.2;
        c.gridx = 0;
        c.gridy = 0;
        northPanel.add(leftPanel, c);

        c.weightx=0.6;
        c.gridx = 1;
        c.gridy = 0;
        northPanel.add(middlePanel, c);

        c.weightx=0.2;
        c.gridx = 2;
        c.gridy = 0;

        northPanel.add(rightPanel, c);

        JButton bigButton1 = new JButton("BigButton1");
        JButton bigButton2 = new JButton("BigButton2");
        bigButton1.setPreferredSize(new Dimension(100,100));
        bigButton2.setPreferredSize(new Dimension(100,100));

        middlePanel.add(bigButton1);
        middlePanel.add(bigButton2);

        JButton smallButton1 = new JButton("SmallButton1");
        JButton smallButton2 = new JButton("SmallButton2");

        rightPanel.setLayout(new BorderLayout());
        rightPanel.add(BorderLayout.SOUTH, innerRightPanel);
        innerRightPanel.add(smallButton1);
        innerRightPanel.add(smallButton2);

        adjustPanel();
        f.setVisible(true);

    }
    
    public void componentHidden(ComponentEvent e) {

    }
    
    public void componentShown(ComponentEvent e) {

    }
    
    public void componentMoved(ComponentEvent e) {

    }
    
    public void componentResized(ComponentEvent e) {
        adjustPanel();
    }
    
    private void adjustPanel() {
        leftPanel.setPreferredSize(rightPanel.getPreferredSize());
    }

    public static void main(String[] args) {
        new Gui();
    }
}

Allerdings weiß ich nicht, ob diese deinen Ansprüchen genügt.
 
Java:
javax.swing.Box.Filler

das gibts ja noch, wird sowas auch "allgemein" nicht gemacht? Wenn nicht, wozu gibts das überhaupt?
 

Zurück
Oben