# JPanel anordnen



## snopy019 (23. Jan 2007)

Hallo alle  zusammen,

ich hoffe ihr könnt mir helfen. Und zwar hab ich folgendes Problem. Ich will auf einen JPanel(MainPanel) fünf weitere JPanel anordnen. 

1111111122222
1111111122222
1111111133333
4444555533333
4444555533333

Diese JPanels sollen wie oben verteilt werden. Auf den Panels wird anschließend eine Graphic(Panel1,2,4) oder JButton(3,5) ausgegeben, die der Größe der JPanels angepasst werden! Also die Graphic oder Buttons bestimmen nicht die Größe der JPanels. Die Größe der einzelnen Bereiche ergibt sich aus der größe des Bildschirms.

Ich hab versucht das ganze mit Layoutmanager durchzuführen. Aber ohne Erfolg. Das Main Panel lässt sich nicht so aufteilen. setLocation und setSize kann nicht verwendet werden!

Hätte jemand eine Tipp, wie ich dies machen könnte?

Vielen Dank

stefan


----------



## The_S (23. Jan 2007)

Schau dir mal das Form-Layout von www.jgoodies.com an.


----------



## André Uhres (23. Jan 2007)

Mit GridBagLayout:

```
package layout;
/*
 * EinsAusFuenfDemo.java
 */
import java.awt.*;
import javax.swing.*;
public class EinsAusFuenfDemo extends JFrame {
    public EinsAusFuenfDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(650,450);
        setLocationRelativeTo(null);
        GridBagConstraints gridBagConstraints;
        mainPanel = new JPanel();
        jPanel1 = new JPanel();
        jPanel2 = new JPanel();
        jPanel4 = new JPanel();
        jPanel5 = new JPanel();
        jPanel3 = new JPanel();
        mainPanel.setLayout(new GridBagLayout());
        jPanel1.setBackground(new Color(255, 255, 204));
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 8;
        gridBagConstraints.gridheight = 6;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 8.0;
        gridBagConstraints.weighty = 6.0;
        mainPanel.add(jPanel1, gridBagConstraints);
        jPanel2.setBackground(new Color(255, 204, 204));
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 8;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 5;
        gridBagConstraints.gridheight = 4;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 5.0;
        gridBagConstraints.weighty = 4.0;
        gridBagConstraints.insets = new Insets(0, 0, 72, 0);
        mainPanel.add(jPanel2, gridBagConstraints);
        jPanel4.setBackground(new Color(204, 255, 255));
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.gridheight = 4;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 4.0;
        gridBagConstraints.weighty = 4.0;
        mainPanel.add(jPanel4, gridBagConstraints);
        jPanel5.setBackground(new Color(204, 255, 204));
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 4;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.gridheight = 4;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 4.0;
        gridBagConstraints.weighty = 4.0;
        mainPanel.add(jPanel5, gridBagConstraints);
        jPanel3.setBackground(new Color(204, 204, 255));
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 8;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 5;
        gridBagConstraints.gridheight = 9;
        gridBagConstraints.fill = GridBagConstraints.BOTH;
        gridBagConstraints.ipady = 10;
        gridBagConstraints.weightx = 5.0;
        gridBagConstraints.weighty = 6.0;
        mainPanel.add(jPanel3, gridBagConstraints);
        getContentPane().add(mainPanel, BorderLayout.CENTER);
    }
    public static void main(String args[]) {new EinsAusFuenfDemo().setVisible(true);}
    private JPanel jPanel1, jPanel2, jPanel3, jPanel4, jPanel5, mainPanel;
}
```


----------



## snopy019 (23. Jan 2007)

Hallo,

@André Uhres, vielen vielen Dank. Genau das hab ich gebraucht. Hab jetzt schon Tage damit verbracht.

lg stefan


----------



## snopy019 (23. Jan 2007)

Hallo,

also fast hab ich mit eurer Hilfe das scheinbare unlösbare Problem gelöst.  ;-)  . Allerdings nur fast.
In den entsprechenden JPanels(1,2,4) kann ich ohne weiteres Zeichnen. Also das funktioniert. Die Grafiken passen sich der Größe der JPanels an.
Allerdings, wenn ich in JPanel 3, die JButtons einfüge, verändert sich das gesamte Layout!  :?  Darunter verstehe ich, dass sich die größen der JPanels ändern. Und dies soll und darf nicht sein.
Hat jemand einen Vorschlag, wie man dies unterbinden kann?

Vielen Dank für eure Hilfe!

Lg stefan


----------



## André Uhres (23. Jan 2007)

```
...
//        gridBagConstraints.insets = new Insets(0, 0, 72, 0);//<--------------------rausnehmen
        mainPanel.add(jPanel2, gridBagConstraints);
...
        jPanel3.setBackground(new Color(204, 204, 255));
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.gridx = 8;
        gridBagConstraints.gridy = 7;//<------------------------ statt 1
        gridBagConstraints.gridwidth = 5;
        gridBagConstraints.gridheight = 6;//<--------------------- statt 9
        gridBagConstraints.fill = GridBagConstraints.BOTH;
//        gridBagConstraints.ipady = 10;//<--------------------rausnehmen
        gridBagConstraints.weightx = 5.0;
        gridBagConstraints.weighty = 6.0;
        mainPanel.add(jPanel3, gridBagConstraints);
...
```
Ist nicht ganz so wie du wolltest, aber im Moment hab ich nix Besseres. Vielleicht nützt ja Hobbits Vorschlag?


----------



## Guest (23. Jan 2007)

Hallo, 

ist leider nicht so wie ich es benötigen würde. Ich kann das Problem seit Wochen nicht lösen, und schön langsam wirds eng. Auf dem Link vom Hobbit war ich schon. Konnte aber nix brauchbares finden. *leider*.

Vielleicht weiß jemand wie ich das Problem anders lösen könnte?

Die Oberfläche besteht aus einer Menüzeile, dann JToolbar(nicht verschiebar). Danch kommt eine JTabbedPane mit ein paar Register. Auf einem Register davon wird eine Vertikale(nicht verschiebar) und Horizontale JToolbar(nicht verschiebar) und das MainPanel angeordnet. 
Und auf dieses MainPanel kommen die 5 Panels. Die fünf Panels müssen fix angeordnet werden und dürfen die Größe nicht verändern. Auf 3 davon kommt eine Graphics2D. Diese Graphiken werden auf die Größe der JPanels angeordnet.
Ich könnte auch das 4 und 5 JPanel zusammenfassen, aber das bringt ja auch nix,oder?

1111111122222 
1111111122222 
1111111133333 
4444444433333 
4444444433333

Mein erster Ansatz war,  die Höhe des MainPainels herauszufinden. Allerdings ist das unmöglich, da ich die Höhe erst erhalte, wenn alles gezeichnet ist. Ich brauch sie aber vorher, denn dann könnte ich die Panels mit setSize() & setLocation() festsetzen.  Kurz zusammengefasst ich fand keinen Weg, die Höhe des MainPanels festzustellen und den 5 Panels eine gewünschte Größe bzw. Position zuzuordnen.

Mein zweiter Ansatz war der, jetztige. Ich lies den Java LayoutManager die genaue Größe der JPanels selbst zu bestimmen. Allerdings wenn ich einen JButton drauf lege, verändern sich die Größen der JPanels. Also wieder nix.

Weiß irgendwer vielleicht doch einen Weg. Ich hänge seit Wochen an diesem Problem und schaffe es nicht zu lösen.

Vielen Dank

Lg stefan


----------



## The_S (23. Jan 2007)

einfahc das Form-Layout runterladen und mal ein bisschen damit rumprobieren. Gibt auch ne gute Hifle dazu. Sollte aber eigentlich auch mit dem GridBagLayout funktionieren, verwende ich aber nie


----------



## André Uhres (23. Jan 2007)

Mit GroupLayout geht's auch gut. Du brauchst dazu nur dieses jar im classpath:
https://swing-layout.dev.java.net/files/documents/2752/25312/swing-layout-1.0.jar

```
package layout;
/*
 * GroupLayoutDemo.java
 */
import java.awt.*;
import java.net.*;
import javax.swing.*;
import org.jdesktop.layout.*;
public class GroupLayoutDemo extends JFrame {
    private JPanel jPanel1, jPanel2, jPanel4, jPanel5, jPanel3;
    private Image img;    
    public GroupLayoutDemo() {
        super("GroupLayout Demo");
        setSize(800,600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        try {
            img = new ImageIcon(new URL("http://upload.wikimedia.org/wikipedia/commons/4/47/" +
                    "PNG_transparency_demonstration_1.png")).getImage();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        jPanel1 = new JPanel();
        jPanel2 = new JPanel();
        jPanel4 = new JPanel();
        jPanel5 = new JPanel();
        jPanel3 = new JPanel();
        jPanel1.setBackground(new Color(204, 255, 255));
        jPanel2.setBackground(new Color(204, 204, 255));
        jPanel4.setBackground(new Color(255, 204, 204));
        jPanel5.setBackground(new Color(255, 255, 204));
        jPanel3.setBackground(new Color(204, 255, 204));
        jPanel1.add(new JLabel(new ImageIcon(img)));
        jPanel2.add(new JLabel(new ImageIcon(img.getScaledInstance(250,-1,Image.SCALE_SMOOTH))));
        jPanel4.add(new JLabel(new ImageIcon(img.getScaledInstance(150,-1,Image.SCALE_SMOOTH))));
        jPanel3.setLayout(new GridLayout(6,3));
        for (int i = 0; i < 18; i++)  jPanel3.add(new JButton("3"));
        jPanel5.setLayout(new GridLayout(4,2));
        for (int i = 0; i < 8; i++)  jPanel5.add(new JButton("5"));
        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(GroupLayout.LEADING)
                .add(GroupLayout.TRAILING, layout.createSequentialGroup()
                .add(layout.createParallelGroup(GroupLayout.TRAILING)
                .add(layout.createSequentialGroup()
                .add(jPanel4, GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)
//                        .addPreferredGap(LayoutStyle.RELATED)
                .add(jPanel5, GroupLayout.DEFAULT_SIZE, 105, Short.MAX_VALUE))
                .add(jPanel1, GroupLayout.DEFAULT_SIZE, 221, Short.MAX_VALUE))
//                .addPreferredGap(LayoutStyle.RELATED)
                .add(layout.createParallelGroup(GroupLayout.LEADING)
                .add(jPanel3, GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)
                .add(jPanel2, GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)))
                );
        layout.setVerticalGroup(
                layout.createParallelGroup(GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                .add(jPanel1, GroupLayout.DEFAULT_SIZE, 190, Short.MAX_VALUE)
//                .addPreferredGap(LayoutStyle.RELATED)
                .add(layout.createParallelGroup(GroupLayout.LEADING)
                .add(jPanel5, GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE)
                .add(jPanel4, GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE)))
                .add(layout.createSequentialGroup()
                .add(jPanel2, GroupLayout.DEFAULT_SIZE, 90, Short.MAX_VALUE)
//                .addPreferredGap(LayoutStyle.RELATED)
                .add(jPanel3, GroupLayout.DEFAULT_SIZE, 177, Short.MAX_VALUE))
                );
    }
    public static void main(String args[]) {new GroupLayoutDemo().setVisible(true);}
}
```


----------



## snopy019 (24. Jan 2007)

Hallo,

@André Uhres: Danke für dein Bemühen. Habs ausprobiert, allerdings bleibt das Problem das Selbe.
@Hobbit: Das Layout hab ich, allerdings weiss ich nicht, wie ich die Größe der JPanels konstant halten kann.

Das unten angeführte Layout will ich haben, und bekomm es auch auf beiden Varianten. Kann ohne Probleme Grafiken hinzufügen, ohne das sich die Größe der JPanels ändern.
1111111122222 
1111111122222 
1111111133333 
4444555533333 
4444555533333 

Leg ich allerdings in JPanel3 ein paar Buttons rein, dann sieht das Layout folgendermaßen aus:

1111111122222 
1111333333333 
1111333333333 
4455333333333 
4455333333333 

Dies darf oder soll nicht passieren. Die JPanels sollen nicht ihre Größe verändern, sonder immer an der gleiche Größe beibehalten. Grafiken werden abgeschnitten,etc.

Lg stefan


----------



## André Uhres (24. Jan 2007)

snopy019 hat gesagt.:
			
		

> ..@André Uhres: Danke für dein Bemühen. Habs ausprobiert, allerdings bleibt das Problem das Selbe..


Lässt sich aber diesmal problemlos anpassen: hab's jetzt editiert, genau wie du's haben willst  :wink:


----------



## The_S (24. Jan 2007)

Hier eine kleine Demo mit dem Form-Layout von jgoodies


```
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;


public class PanelTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		JFrame frame = new JFrame();
		JPanel one = new JPanel();
		JPanel two = new JPanel();
		JPanel three = new JPanel();
		JPanel four = new JPanel();
		JPanel five = new JPanel();
		FormLayout form = new FormLayout("1px:grow, 1px:grow, 1px:grow", "1px:grow, 1px:grow, 1px:grow, 1px:grow, 1px:grow");
		CellConstraints cc = new CellConstraints();
		frame.setLayout(form);
		one.add(new JButton("One"));
		two.add(new JButton("Two"));
		three.add(new JButton("Three"));
		four.add(new JButton("Four"));
		five.add(new JButton("Five"));
		one.setBackground(Color.green);
		two.setBackground(Color.red);
		three.setBackground(Color.blue);
		four.setBackground(Color.gray);
		five.setBackground(Color.orange);
		frame.add(one, cc.xywh(1, 1, 2, 3));
		frame.add(two, cc.xywh(3, 1, 1, 2));
		frame.add(three, cc.xywh(3, 3, 1, 3));
		frame.add(four, cc.xywh(1, 4, 1, 2));
		frame.add(five, cc.xywh(2, 4, 1, 2));
		frame.setSize(400, 400);
		frame.setVisible(true);
		
	}

}
```


----------



## snopy019 (24. Jan 2007)

Guten Morgen!

leider komm ich so auch nicht weiter. André's Vorschlag ist gut, aber wenn mehr buttons eingefügt werden, dann kommt es trotz allem zur Veränderung der Größe. Das darf unter keinen Umständen passieren-Anforderung!

Das ganze Programm würde laufen, wenn ich nur dieses Problem im Griff bekommen würde. Seit Wochen häng ich dran und find wirklich keine Lösung!   

Wenn ich das Layout(JPanels) manuell festlege, also mit setSize() setLocation(), funktioniert alles einwandfrei. Aber das Programm soll sich auf allen möglichen Bildschirmgrößen anpasen können. 

Kurz zurück zu meinen ersten Ansatz: Aufs Frame(not resizeable, nicht verschiebar, undecorated) wird eine JMenuBar(), JToolbar(fix) und JTabbedPane drauf gelegt. Auf die JTabbedPane kommt wieder eine horizontatle und verticale JToolbar(fix) und das MainPanel! 
Ich hab es nicht geschafft die Höhe des MainPanels herauszufinden. Ich erhalte die Höhe immer erst, wenn alles gezeichnet wird! Im Konstruktor erhält man ja mit getSize oder getPreferredSize den Wert 0. Aber bevor alles gezeichnet wird muss ich ja die anderen JPanels die Größe festsetzen! Also wurde daraus nix. 

Und es sieht so aus, wie wenn der 2te Weg auch nicht zielführend ist. Denn das Layout soll konstant sein, und die Elemente sollen sich aufs Layout anpassen!

Weiß irgendwer vielleicht einen 3ten Weg??

Lg stefan


----------



## The_S (24. Jan 2007)

Schonmal mein Beispiel ausprobiert? Bei mir hat das ohne Probleme funktioniert ...


----------



## André Uhres (24. Jan 2007)

snopy019 hat gesagt.:
			
		

> ..wenn mehr buttons eingefügt werden, dann kommt es trotz allem zur Veränderung der Größe..


Das muss der LayoutManager ja auch machen, wenn die Buttons nicht mehr ins Panel passen.
Wieviele Buttons hast du denn? In meinem Beispiel sind ja schon 26.
Wenn die Zahl unbegrenzt ist, wäre ein JScrollpane veilleicht die Lösung:

```
...
        JScrollPane scroll3 = new JScrollPane();
        scroll3.setViewportView(jPanel3);
        for (int i = 0; i < 208; i++)  jPanel3.add(new JButton("3"));
...
                .add(scroll3, GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)  //scroll3 anstatt jPanel3
...
                .add(scroll3, GroupLayout.DEFAULT_SIZE, 177, Short.MAX_VALUE))  //scroll3 anstatt jPanel3

...
```


----------



## snopy019 (24. Jan 2007)

Hi,

Danke euch beiden!

@Hobbit, natürlich hab ichs ausprobiert. Es funktioniert zum Teil. 
@André, das wäre auch noch ein Versuch Wert mit einer JScrollPane().

Werd jetzt versuchen, das FromLayout vom Hobbit und das GridBagLayout mit einer JScrollPane() zu kombinieren. Mal sehen.

Werd euch dann bescheid geben!

lg stefan


----------



## The_S (24. Jan 2007)

snopy019 hat gesagt.:
			
		

> @Hobbit, natürlich hab ichs ausprobiert. Es funktioniert zum Teil.



Und welcher Teil funktioniert nicht?


----------



## snopy019 (24. Jan 2007)

Hallo,

erstmals es ist endlich geschafft!! Tausend Dank euch Beiden!

Das FormLayout funktionierte nicht, weil ich einen Blödsinn gemacht hab. ;-). Und es zeigte nicht alle JButtons an. Aufjedenfall ist das FormLayout eine gute Sache. Es macht genau dass, was ich gesucht hab.

Gelöst hab ich das Problem nun mit einem FormLayout und einer Scrollbar.

Lg Stefan


----------



## bronks (24. Feb 2007)

André Uhres hat gesagt.:
			
		

> Mit GridBagLayout:
> 
> ```
> package layout;
> ...


Zu dem Demo habe ich eine Frage:

Was muß man machen, damit zwischen den einzelnen Panels ein Abstand von z.B. 5 Pixel eingehalten wird? Damit meine ich, dass sich die bunten Flächen nicht berühren und ein 5 Pixel breiter z.B. grauer Rand/Grenze dazwischen liegt.

Danke!


----------

