LayoutManager Beliebige Anzahl von Panels für LayoutManager

Gerald

Mitglied
Guten Tag Experten und Neugierige,

folgendes Ansinnen habe ich: Mittels Layoutmanager (GroupLayout) sollen Panels (JPanel)
in Zeilen und Spalten mit beliebiger Anzahl angelegt werden.

Java:
//...
row = new SequentialGroup[rows];
row[0] = layout.createSequentialGroup();

row[0].addGroup(layout.createParallelGroup()
                        .addComponent(pan.get(0).getPanel()
                        .addComponent(pan.get(1).getPanel() ));
//u.s.w.

Prinzipiell funktioniert es, aber nur mit festgelegter Anzahl von Zeilen und Spalten.

Folgendes schien ein Ansatz zu sein, aber es gibt unerwünschte Effekte: Die Panels haben
nichtgewollte Abstände. Dies liegt, so glaube ich, an dem wiederholten "addGroup".

Java:
ParallelGroup pr1 = layout.createParallelGroup();
ParallelGroup pr2 = layout.createParallelGroup();

row[0].addGroup(pr1.addComponent(pan.get(0).getPanel()));
row[0].addGroup(pr1.addComponent(pan.get(1).getPanel()));

row[0].addGroup(pr2.addComponent(pan.get(2).getPanel()));
row[0].addGroup(pr2.addComponent(pan.get(3).getPanel()));
//u.s.w.

ParallelGroup pc = layout.createParallelGroup();
SequentialGroup sc1 = layout.createSequentialGroup();
SequentialGroup sc2 = layout.createSequentialGroup();

col[0].addGroup(pc.addGroup(sc1.addComponent(pan.get(0).getPanel())));
col[0].addGroup(pc.addGroup(sc1.addComponent(pan.get(1).getPanel())));

col[0].addGroup(pc.addGroup(sc2.addComponent(pan.get(2).getPanel())));
col[0].addGroup(pc.addGroup(sc2.addComponent(pan.get(3).getPanel())));
//u.s.w.

Um beliebige Spalten- und Zeilenanzahl einstellen zu können, will ich Schleifen benutzen.
In etwa wie folgt:

Java:
int pc[] = new int[10];
int sc[] = new int[10];

for (int h = 0; h < lenH; h++)
    for (int i = 0; i < lenI; i++)
        for (int j = 0; j < lenJ; j++)
            col[0].addGroup(pc[h].addGroup(sc[i].addComponent(pan.get(j).getPanel())));

In der angedachten Schleife wird "addGroup" jedes Mal wiederholt.
Mir ist es noch nicht gelungen eine Konstruktion zu finden, die zu oft wiederholtes "addGroup"
vermeidet.

Ist mein Verdacht richtig, daß es an "addGroup" liegt?
Hat Jemand eine Idee, wie ich das Problem (beliebige Anzahl) lösen kann?

(Ich habe den Kode knapp gehalten, weil ich denke, daß es für das Verständnis meines Problems
schon reichen könnte.)

Gespannt auf eine Antwort hofft
Gerald
 
Das hatten wir doch schon einmal... (https://www.java-forum.org/thema/variable-elemente-fuer-grouplayout.182075/#post-1159248)

Hier mal ein Beispiel:

Java:
import javax.swing.*;
import javax.swing.GroupLayout.*;
import java.util.ArrayList;
import java.util.List;

public class Test {
    private List<JComponent> components = new ArrayList<>();

    public Test() {
        for (int i = 0; i < 100; i++) {
            components.add(new JLabel("Label " + (i+1)));
        }
    }

    private JPanel createContentPane(int cols, int rows) {
        JPanel panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);

        SequentialGroup horizontal = layout.createSequentialGroup();
        for (int x = 0; x < cols; x++) {
            ParallelGroup par = layout.createParallelGroup();
            for (int y = 0; y < rows; y++) {
                par.addComponent(components.get(y*cols + x));
            }
            horizontal.addGroup(par);
        }

        SequentialGroup vertical = layout.createSequentialGroup();
        for (int y = 0; y < rows; y++) {
            ParallelGroup par = layout.createParallelGroup();
            for (int x = 0; x < cols; x++) {
                par.addComponent(components.get(y*cols + x));
            }
            vertical.addGroup(par);
        }

        layout.setHorizontalGroup(horizontal);
        layout.setVerticalGroup(vertical);

        return panel;
    }

    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(createContentPane(10, 10));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}

Natürlich würde es auch reichen, nur rows oder nur cols zu übergeben und den jeweils anderen Teil aus der Anzahl der Elemente zu berechnen. Außerdem geht der Code davon aus, dass das komplette Rechteck ausgefüllt werden kann.
 
Hallo Mihe7,
danke für Deine Antwort. Du hast recht, das hatten wir schon mal so ähnlich. Aber ich will eigentlich was anderes.
Es geht darum in einer Struktur aus Zeilen und Spalten wiederum wahlweise eine "Substruktur" anzulegen.
Mit Deinem Kode:
Java:
par.addComponent(components.get(y*cols + x));
löse ich meine Aufgabe nicht.
Du hast Dir wieder Mühe gemacht, aber wir haben uns wohl nicht richtig verstanden.
Ich glaube, daß die Sache mit "addGroup" gelöst werden muß. Es scheint, daß es etwas wie "getGroup" geben müßte, aber ich habe nichts gefunden.
Wegen der Sache mit "Substrukturen" soll es auch möglich sein "unregelmäßige" Strukur zu erzeugen; also in den Spalten sind nicht überall gleich viele Zeilen. "addComponent" ist nicht geeignet eine "Substruktur" einzubauen. Oder siehst Du das anders?
Das zu lösende Problem besteht meiner Meinung nach hier:
Java:
col[0].addGroup(pc.addGroup(sc1.addComponent(pan.get(0).getPanel())));
"addComponent" erlaubt nur das Einfügen einer Komponente, nicht einer Gruppe. Oder?
 
Hallo!
Hab es selber herausbekommen.
Java:
ParallelGroup p1 = layout.createParallelGroup();
ParallelGroup p2 = layout.createParallelGroup();

p1.addComponent(pan.get(0).getPanel());
p1.addComponent(pan.get(1).getPanel());
p1.addComponent(pan.get(2).getPanel());
row.addGroup(p1);

p2.addComponent(pan.get(3).getPanel());
p2.addComponent(pan.get(4).getPanel());
p2.addComponent(pan.get(5).getPanel());
row.addGroup(p2);
//u.s.w.

Sequential s1 = layoutSequentialGroup();
Sequential s2 = layoutSequentialGroup();

s1.addComponent(pan.get(0).getPanel())
s1.addComponent(pan.get(1).getPanel())
//u.s.w.

ParallelGroup p = layout.createParallelGroup();
p.addGroup(s1);
//u.s.w.

col.addGroup(p);
//u.s.w.
Schönen Tag noch ...
 

Neue Themen


Zurück
Oben