LayoutManager Panels anordnen über Schleifenvariablen

G

Gerald

Mitglied
Hallo!
Nach seehr langer Zeit möchte ich jetzt mal ein altes Thema aufwärmen; es gab bei mir über Monate einfach andere Prioritäten.

Hier funktionierender Kode (Anordnung von 4 Panel in einem Frame, ohne Schleifen):

Java:
import java.awt.Font;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.GroupLayout.SequentialGroup;
import javax.swing.JLabel;

public class GroupLayout_0 {
    private static int getCol () { return (int) (Math.random() * 255); }
    
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        
        JPanel panel0 = new JPanel();
        GroupLayout layout = new GroupLayout(panel0);
        GroupLayout.ParallelGroup horizontalGroup = layout.createParallelGroup()
                                , verticalGroup = layout.createParallelGroup();

        JPanel p[] = new JPanel[4];
        for (int i = 0; i < 4; i++) {
            p[i] = new JPanel();
                JLabel l0 = new JLabel(String.valueOf(i));
                l0.setFont(new Font(Font.SERIF, Font.PLAIN, 40)); p[i].add(l0);
                int col1 = getCol(); int col2 = getCol(); int col3 = getCol();
                p[i].setBackground(new java.awt.Color(col3, col2, col1));
        }

        layout.setHorizontalGroup(horizontalGroup);
        SequentialGroup[] seqGroup1 = new GroupLayout.SequentialGroup[1];
        seqGroup1[0] = layout.createSequentialGroup();
        horizontalGroup.addGroup(seqGroup1[0]);

        layout.setVerticalGroup(verticalGroup);
        SequentialGroup[] seqGroup2 = new GroupLayout.SequentialGroup[1];
        seqGroup2[0] = layout.createSequentialGroup();
        verticalGroup.addGroup(seqGroup2[0]);

        seqGroup1[0].addGroup(layout.createParallelGroup()
                        .addComponent(p[0])
                        .addComponent(p[1]));
        seqGroup1[0].addGroup(layout.createParallelGroup()
                        .addComponent(p[2])
                        .addComponent(p[3]));
        
        seqGroup2[0].addGroup(layout.createParallelGroup()
                      .addGroup(layout.createSequentialGroup()
                        .addComponent(p[0])
                        .addComponent(p[1]))
                      .addGroup(layout.createSequentialGroup()
                        .addComponent(p[2])
                        .addComponent(p[3])));
        panel0.setLayout(layout);
        f.add(panel0);
        f.setSize(300, 300);
        f.setVisible(true);
    }
}

Wie kann ich mittels Schleifenzähler Panels anordnen?
Und hier einer meiner nicht zufriedenstellenden Ansätze:

Java:
SequentialGroup x1;
x1 = seqGroup1[0].addGroup(layout.createParallelGroup());
for (int i = 0; i < 2; i++)
    x1.addComponent(p[i]);

x1 = seqGroup1[0].addGroup(layout.createParallelGroup());
for (int i = 2; i < 4; i++)
    x1.addComponent(p[i]);
//------------------------
SequentialGroup y0;
y0 = seqGroup2[0].addGroup(layout.createParallelGroup());

SequentialGroup y1;
y1 = y0.addGroup(layout.createSequentialGroup());
for (int i = 0; i < 2; i++)
    y1.addComponent(p[i]);
        
y1 = y0.addGroup(layout.createSequentialGroup());
for (int i = 2; i < 4; i++)
    y1.addComponent(p[i]);

Es sind hier nur vier Panels, aber es geht ums Prinzip. Offensichtlich werden die Panels nicht richtig angeordnet, sie werden diagonal angeordnet. Es sollen aber 2 Zeilen und 2 Spalten sein. Wie hängt man die Componenten hinter ...addGroup... an?

Meine Frage ist: Wie muß die exakte Syntax lauten?
Ich denke, es ist nicht schwer, aber ich habe keine Idee im Moment. Habe schon andere Varianten versucht.
Es geht definitiv um Scheifen deren Laufvariablen sich ändern sollen.

Danke für Hilfe.
 
G

Gerald

Mitglied
Gestern dachte ich die Lösung gefunden zu haben. Leider nein. Aber bin der Lösung einen kleinen Schritt näher.
Hier ein Zwischenschritt, es ist ein Kompromiss. Es funktioniert nur ein bisschen.

Java:
SequentialGroup x1[] = new GroupLayout.SequentialGroup[1];
x1[0] = layout.createSequentialGroup();

for (int i = 0; i < 2; i++)
    x1[0].addComponent(p[i]);
seqGroup1[0].addGroup(layout.createParallelGroup().addGroup(x1[0]));

for (int i = 2; i < 4; i++)
    x1[0].addComponent(p[i]);
seqGroup1[0].addGroup(layout.createParallelGroup().addGroup(x1[0]));
//------------------------
seqGroup2[0].addGroup(layout.createParallelGroup()
              .addGroup(layout.createSequentialGroup()
                .addComponent(p[0])
                .addComponent(p[1]))
              .addGroup(layout.createSequentialGroup()
                .addComponent(p[2])
                .addComponent(p[3])));

Sieht so aus:
Code:
+---+     +---+
|  0  |      |  2  |
+---+---+---+---+
        |  1  |      |  3  |
       +---+     +---+
Warum sind Panel 1 und Panel 3 diagonal versetzt?
 
Zuletzt bearbeitet von einem Moderator:
G

Gerald

Mitglied
Klappt nicht! Jedenfalls ist Panel 1 diagonal mit Panel 0, und Panel 2 mit Panel 3 versetzt. Soll aber nicht sein.
 
G

Gerald

Mitglied
Also, für den horizontalen Teil habe ich folgendes ausprobiert:

Code:
seqGroup1[0].addGroup(layout.createParallelGroup()
                .addGroup(layout.createSequentialGroup()
                        .addComponent(p[0])
                        .addComponent(p[1])));
seqGroup1[0].addGroup(layout.createParallelGroup()
                .addGroup(layout.createSequentialGroup()
                        .addComponent(p[2])
                        .addComponent(p[3])));

Das Ergebnis sind wieder diagonal versetzte Panels. Das müßte heißen, daß die
Konstruktion mit Schleifen den Fehler bei x1[] hat.

Java:
...
SequentialGroup x1[] = new GroupLayout.SequentialGroup[1];
x1[0] = layout.createSequentialGroup();
for (int i = 2; i < 4; i++)
    x1[0].addComponent(p[i]);
seqGroup1[0].addGroup(layout.createParallelGroup().addGroup(x1[0]));

So habe ich etwas anderes probiert:

Code:
seqGroup1[0].addGroup(layout.createParallelGroup());
for (int i = 0; i < 2; i++)
    seqGroup1[0].addComponent(p[i]);

seqGroup1[0].addGroup(layout.createParallelGroup());
for (int i = 2; i < 4; i++)
    seqGroup1[0].addComponent(p[i]);

Leider funktioniert das auch noch nicht richtig. Nach meiner Meinung müßten doch aber in der
letzten Konstruktion die Componenten [Panels] an seqGroup1[0].addGroup(layout.createParallelGroup())
in 2 Spalten mit jeweils 2 untereinander angeordneten Panels angehangen werden.

Kann mir Jemand erklären warum das offensichtlich nicht so ist?
Entspricht das nicht der ursprünglichen Kodierung? :
Java:
seqGroup1[0].addGroup(layout.createParallelGroup()
                        .addComponent(p[0])
                        .addComponent(p[1]));
 
mihe7

mihe7

Top Contributor
Es sind hier nur vier Panels, aber es geht ums Prinzip.
Das Prinzip ist, dass die Spalten und Zeilen zunächst einmal sequentiell angeordnet sind. In jeder Spalte und jeder Zeile hast Du aber ggf. mehrere Komponenten "parallel".

Du willst etwas wie
Code:
01
23
Du hast
1. zwei Spalten nebeneinander (sequentiell). Die erste Spalte enthält (parallel) 0 und 2, die zweite Spalte 1 und 3.
2. zwei Zeilen untereinander (sequentiell). Die erste Zeile enthält (parallel) 0 und 1, die zweite 2 und 3.

D. h die horizontale und die vertikale Gruppe sind jeweils eine Sequenz paralleler Gruppen.

Quick, dirty und ungetestet könnte etwas in der Richtung funktionieren:
Java:
public class GridGroups {
    private final GroupLayout layout;
    private final int nCols;
    public GridGroups(GroupLayout layout, int nCols) {
        this.layout = layout;
        this.nCols = nCols;
    }

    public GroupLayout.SequentialGroup groupRows(JComponent ... comps) {
        int nRows = (comps.length + nCols - 1) / nCols;
        GroupLayout.SequentialGroup seq = layout.createSequentialGroup();

        for (int row = 0; row < nRows; row++) {
            GroupLayout.ParallelGroup rowGroup = layout.createParallelGroup();
            for (int col = 0; col < nCols; col++) {
                int ix = row * nCols + col;
                if (ix < comps.length) {
                    rowGroup.addComponent(comps[ix]);
                }
            }
            seq.addGroup(rowGroup);
        }

        return seq;
    }

    public GroupLayout.SequentialGroup groupColumns(JComponent ... comps) {
        int nRows = (comps.length + nCols - 1) / nCols;
        GroupLayout.SequentialGroup seq = layout.createSequentialGroup();

        for (int col = 0; col < nCols; col++) {
            GroupLayout.ParallelGroup colGroup = layout.createParallelGroup();
            for (int row = 0; row < nRows; row++) {
                int ix = row * nCols + col;
                if (ix < comps.length) {
                    colGroup.addComponent(comps[ix]);
                }
            }
            seq.addGroup(colGroup);
        }

        return seq;
    }
}

Die Klasse sollte die horizontale bzw. vertikale Gruppe für das Layout erstellen können.
 
Beste Antwort
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Panels vertikal anordnen AWT, Swing, JavaFX & SWT 10
K Zwei Panels zentriert anordnen AWT, Swing, JavaFX & SWT 3
B Bounds aller Panels aktualisieren AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L Swing Panels bewegen wie Windows 10 Kacheln AWT, Swing, JavaFX & SWT 0
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
T Swing Bug: mehrfache Panels bei Mouseover? AWT, Swing, JavaFX & SWT 11
P Zwischen verschiedenen Panels wechseln AWT, Swing, JavaFX & SWT 3
F abgeleitete Panels von einem ContentPanel AWT, Swing, JavaFX & SWT 4
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
R Swing panels nebeneinander mit BoxLayout.X_AXIS AWT, Swing, JavaFX & SWT 4
P Swing Panels Wechseln AWT, Swing, JavaFX & SWT 9
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
V AWT Panels überlappen AWT, Swing, JavaFX & SWT 1
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
U Swing Panels im Contentpane durchschalten AWT, Swing, JavaFX & SWT 1
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
S Swing Plätze von 2 panels vertauschen AWT, Swing, JavaFX & SWT 4
T Panels mit Button verbinden AWT, Swing, JavaFX & SWT 3
F Swing Wie verwalte ich meine Panels richtig? AWT, Swing, JavaFX & SWT 2
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
D Stapelung von Panels AWT, Swing, JavaFX & SWT 6
V Swing MouseEvents bei gestapelten Panels AWT, Swing, JavaFX & SWT 2
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
Kenan89 LayoutManager MigLayout Positionierung von Panels AWT, Swing, JavaFX & SWT 4
A Panels in JavaFX zur Laufzeit erzeugen AWT, Swing, JavaFX & SWT 5
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
F Panels über buttons zu anderen Panels hinzufügen AWT, Swing, JavaFX & SWT 2
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
J Problem mit der Höhe eines Panels AWT, Swing, JavaFX & SWT 11
M Swing JTabbedPane Panels deaktivieren AWT, Swing, JavaFX & SWT 2
S Swing (Nicht) Vergrößern von Panels AWT, Swing, JavaFX & SWT 3
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
B LayoutManager Zeilenweise Anordnung von Panels AWT, Swing, JavaFX & SWT 19
B Panels wechseln auf Knopfdruck AWT, Swing, JavaFX & SWT 17
N Hilfe bei Panels! AWT, Swing, JavaFX & SWT 11
J LayoutManager Panels übereinander AWT, Swing, JavaFX & SWT 3
P Von einem Panel auf die Objekte des anderen Panels zugreifen AWT, Swing, JavaFX & SWT 3
C Aufklappbare Panels AWT, Swing, JavaFX & SWT 2
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
D Vererbung von Panels AWT, Swing, JavaFX & SWT 8
E Wie Breite und Höhe eines Panels festlegen? AWT, Swing, JavaFX & SWT 5
B Panels stapeln, geht das? AWT, Swing, JavaFX & SWT 7
I 2 Panels übereinander, 1 transparent AWT, Swing, JavaFX & SWT 2
S GridBagLayout Panels AWT, Swing, JavaFX & SWT 2
R Swing Kommunikation zwischen Panels AWT, Swing, JavaFX & SWT 2
F Abschaltbare Panels AWT, Swing, JavaFX & SWT 5
aze Layout auf Teil eines Panels anwenden AWT, Swing, JavaFX & SWT 5
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
I Swing Positionieren von Panels mit layoutManager AWT, Swing, JavaFX & SWT 6
B Java Grafiken an bestimmter Positon des Panels anzeigen AWT, Swing, JavaFX & SWT 6
S import von Klassen (zwei Panels eine Form) AWT, Swing, JavaFX & SWT 39
H2SO3- AWT seltsammes verhalten eines Panels AWT, Swing, JavaFX & SWT 9
S Buttons, Panels etc. zu einer Teilkomponente hinzufügen AWT, Swing, JavaFX & SWT 5
S mehere panels übereinander AWT, Swing, JavaFX & SWT 2
Z Swing Gif's in panels einfügen AWT, Swing, JavaFX & SWT 11
N Überschneidung von Panels umgehen AWT, Swing, JavaFX & SWT 3
D java.lang.IllegalArgumentException beim Darstellen eines Panels AWT, Swing, JavaFX & SWT 7
T Border eines Panels nicht an der rechten Kante anzeigen AWT, Swing, JavaFX & SWT 7
F name des panels in der ein button liegt rausfinden AWT, Swing, JavaFX & SWT 10
R AWT: Aufteilung mit Panels? AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
G Ein Frame mit mehreren austauschbaren Panels AWT, Swing, JavaFX & SWT 3
I Applet mit Panels (so richtig, gehts besser?) AWT, Swing, JavaFX & SWT 3
G designfrage zu 2 panels AWT, Swing, JavaFX & SWT 2
hdi zeitgleiches fokusieren von zwei panels AWT, Swing, JavaFX & SWT 2
G 2 Panels, 2 Listener, 1 Problem AWT, Swing, JavaFX & SWT 2
H Im applet auf panels zeichnen AWT, Swing, JavaFX & SWT 9
G Im Applet Panels anzeigen lassen AWT, Swing, JavaFX & SWT 2
G Editierbarkeit aller Komponenten eines Panels AWT, Swing, JavaFX & SWT 5
R Kleine Panels auf einem großen Panel frei platzieren AWT, Swing, JavaFX & SWT 11
G Remove Panels von JFrame AWT, Swing, JavaFX & SWT 5
M Ausrichtung eines Panels AWT, Swing, JavaFX & SWT 7
H Frames oder Panels für mehrere Ansichten? AWT, Swing, JavaFX & SWT 4
M Problem mit Cursor für Panels AWT, Swing, JavaFX & SWT 4
Kidao Mehrer Panels, mit Buttons in einem Frame abwechselnd laden? AWT, Swing, JavaFX & SWT 3
M Hallo Herr Uhres, Frage zu DND_Demo: Ausrichten der Panels:) AWT, Swing, JavaFX & SWT 4
O Panels ein und ausblenden - geht das? AWT, Swing, JavaFX & SWT 3
O eine Frage zu Panels AWT, Swing, JavaFX & SWT 10
M Problem bei Repaint von Panels AWT, Swing, JavaFX & SWT 2
M Größe des Panels ändern? AWT, Swing, JavaFX & SWT 3
O haben panels von anfang an einen dummen rand? AWT, Swing, JavaFX & SWT 19
G Zwischen Panels in einem JFrame wechseln AWT, Swing, JavaFX & SWT 4
M JTree und Anzeige des entsprechenden Panels AWT, Swing, JavaFX & SWT 5
M JList mit unbestimmter Anzahl Panels füllen AWT, Swing, JavaFX & SWT 4
K 2 Panels und Layouts AWT, Swing, JavaFX & SWT 2
K abstände zwischen Panels? AWT, Swing, JavaFX & SWT 3
U suchverfahren vergleich einbinden von panels ? in applet ;) AWT, Swing, JavaFX & SWT 11
N GridBagLayout- bzw Constraints nicht auf Panels anwendbar ? AWT, Swing, JavaFX & SWT 6
T GUI Steuerung (mehrere Panels) AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Anzeige

Neue Themen


Oben