Swing JPanel über gesamte Fensterbreite. "flüssiges" Layout

Status
Nicht offen für weitere Antworten.

Sagattarii

Mitglied
Servus zusammen,

ich sitze hier gerade an einem Java Programm aber irgendwie will das ganze noch nicht so wie ich will :(
Es geht darum folgendes Layout umzusetzen:

attachment.php


Der blaue Teil ist mein JFrame, darin soll es zwei verschiedene Bereiche geben:
1. Ein JScrollPane mit einem Panel, das viele kleinere JPanels enthält (bis jetzt 6 Stück). Die Scrollpane ist grün, das "wrapper" Panel ist gelb und die vielen kleineren Panels sind rot.
2. Ein JPanel mit einigen Buttons drin (hellrot).

Der Frame ist am Beginn 800x600 Pixel groß. Das untere JPanel soll immer 50 Pixel hoch sein und alle Elemente sollen immer so breit wie das gesamte Fenster sein! Das JScrollPane soll also wenn das Fenster nach oben oder unten größer wird auch mitwachsen und eventuell "verschwinden", also die Scrollbars ausgeblendet werden.
Die Abstände zwischen den Elementen sollte natürlich 0 sein, auf dem Bild sind die Abstände nur da um zu zeigen wo was liegen soll. Soll ich eventuell den wrapper wieder entfernen?

Ich poste jetzt hier einfach mal mein Code und wie es im Moment aussieht.

Code:
public class OverviewPanel {

    public static JPanel getOverviewPanel() {

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBackground(Color.GREEN);
        scrollPane.setViewportView(getMainPanel());

        JPanel wrapper = new JPanel();
        wrapper.setLayout(new GridBagLayout());
        GridBagConstraints gridBagConstraints = new GridBagConstraints();

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        wrapper.add(scrollPane, gridBagConstraints);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        wrapper.add(getCreateInvitationPanel(), gridBagConstraints);

        wrapper.invalidate();
        wrapper.validate();
        wrapper.repaint();
        return wrapper;
    }

    private static JPanel getMainPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gridBagConstraints = new GridBagConstraints();

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        panel.add(getInformationPanel(), gridBagConstraints);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        panel.add(getAttendesPanel(), gridBagConstraints);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        panel.add(getMeetingsPanel(), gridBagConstraints);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        panel.add(getAspectsPanel(), gridBagConstraints);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        panel.add(getSeveritiesPanel(), gridBagConstraints);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        panel.add(getProductPanel(), gridBagConstraints);

        panel.invalidate();
        panel.validate();
        panel.repaint();
        return panel;
    }

    private static JPanel getCreateInvitationPanel() {
        JPanel panel = new JPanel();
        panel.add(getCreateInvitationButton());
        panel.setBackground(Color.pink);
        return panel;
    }

    private static JPanel getInformationPanel() {
        //JLabel description = new JLabel(Application.getInstance().getReview().getDescription());
        //JLabel descriptionLabel = new JLabel("Beschreibung:");
        //JLabel name = new JLabel(Application.getInstance().getReview().getName());
        //JLabel nameLabel = new JLabel("Name:");
        JLabel title = new JLabel("1");

        JPanel panel = new JPanel();
        panel.add(title);
        //panel.add(nameLabel);
        //panel.add(name);
        //panel.add(descriptionLabel);
        //panel.add(description);
        panel.setBackground(Color.RED);
        return panel;
    }

    private static JPanel getAttendesPanel() {
        JLabel title = new JLabel("2");
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.add(title);
        return panel;
    }

    private static JPanel getMeetingsPanel() {
        JLabel title = new JLabel("3");
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.add(title);
        return panel;
    }

    private static JPanel getAspectsPanel() {
        JLabel title = new JLabel("4");
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.add(title);
        return panel;
    }

    private static JPanel getSeveritiesPanel() {
        JLabel title = new JLabel("5");
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.add(title);
        return panel;
    }

    private static JPanel getProductPanel() {
        JLabel title = new JLabel("6");
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.add(title);
        return panel;
    }

    private static JButton getCreateInvitationButton() {
        JButton button = new JButton("Create Invitations");
        return button;
    }
}

Das Ganze wird dann einfach in einem JFrame aufgerufen:

Code:
getContentPane().add(OverviewPanel.getOverviewPanel());
getContentPane().invalidate();
getContentPane().validate();
getContentPane().repaint();

Also es sieht auch schon ein bischen so aus wie ich das haben will, aber wie kann ich zum Beispiel ohne die Dimensions angeben, dass die Panels den gesamten Bildschirm ausfüllen?
Ich habe auch noch Probleme damit wann und wo ich jetzt wirklich pack() validate() und repaint() verwenden muss bzw. sollte.

So sieht das ganze bisher aus:

attachment.php


Danke schonmal für eure Hilfe.
 

Marco13

Top Contributor
Die Befehle pack() validate() und repaint() bei Unklarheiten nach einem stochastischen Verfahren im Quelltext zu verteilen macht aber auch keinen Sinn.

pack: Auf Frames, damit sie ihre "Wunschgröße" einnehmen
validate: Um das Layout zu akualisieren, wenn NACH dem Sichtbarmachen eines Panels Elemente hinzugefügt oder entfernt wurden
repaint: Neuzeichnen auslösen - hat nichts mit dem Layout zu tun.

Ansonsten solltest du ggf. mal genauer erklären, was du willst (am besten mit einem KSKB und vielleicht einem (mit Paint skizzierten) Bildchen, wie die Aufteilung sein soll).

Bisher klingt das nach
Code:
ContentPane mit BorderLayout
    ScrollPane im CENTER (im Scrollpane dann ein Panel mit Grid(Bag)Layout, das die kleinen Panels enthält
    Panel im SOUTH mit einer PreferredSize von (1,50) (der x-Wert ist egal)
 

Sagattarii

Mitglied
Also aus irgendeinem Grund hat es meine erste Grafik verschluckt :(

Hier jetzt nochmal, damit ihr sehen könnt was ich eigentlich will:

attachment.php


Der blaue Teil ist mein JFrame, darin soll es zwei verschiedene Bereiche geben:
1. Ein JScrollPane mit einem Panel, das viele kleinere JPanels enthält (bis jetzt 6 Stück). Die Scrollpane ist grün, das "wrapper" Panel ist gelb und die vielen kleineren Panels sind rot.
2. Ein JPanel mit einigen Buttons drin (hellrot).
Der Frame ist am Beginn 800x600 Pixel groß. Das untere JPanel soll immer 50 Pixel hoch sein und alle Elemente sollen immer so breit wie das gesamte Fenster sein! Das JScrollPane soll also wenn das Fenster nach oben oder unten größer wird auch mitwachsen und eventuell "verschwinden", also die Scrollbars ausgeblendet werden.
 

Marco13

Top Contributor
Code:
// For http://www.java-forum.org/awt-swing-swt/84137-jpanel-ueber-gesamte-fensterbreite-fluessiges-layout.html

import javax.swing.*;
import java.awt.*;

class OverviewPanelTest extends JFrame
{
    public static void main(String args[])
    {
        new OverviewPanelTest().setVisible(true);
    }


    public OverviewPanelTest()
    {
        getContentPane().setLayout(new BorderLayout());

        JPanel yellowPanel = new JPanel(new GridLayout(0,1));
        for (int i=0; i<8; i++)
        {
            JPanel redPanel = new JPanel();
            redPanel.setBackground(Color.RED);
            redPanel.setPreferredSize(new Dimension(100,100));
            redPanel.setBorder(BorderFactory.createTitledBorder("title"));
            yellowPanel.add(redPanel);
        }
        getContentPane().add(new JScrollPane(yellowPanel), BorderLayout.CENTER);

        JPanel lightRedPanel = new JPanel();
        for (int i=0; i<5; i++)
        {
            lightRedPanel.add(new JButton("Button "+i));
        }
        lightRedPanel.setPreferredSize(new Dimension(100,50));
        getContentPane().add(lightRedPanel, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800,600);
    }
}
???:L
 

Sagattarii

Mitglied
So, habe jetzt mal deinen Rat befolgt und das GridBagLayout gegen BorderLayout ersetzt und es tut soweit :) *freu*

Code:
    public void switchToOverview() {
        Container content = getContentPane();
        content.removeAll();
        content = OverviewPanel.getOverview(content);
        setContentPane(content);
    }

Damit wird alter Content des JFrame gelöscht und nun der neue Inhalt geladen.

Und hier jetzt meine Klasse Overview.

Code:
public class Overview {

    public static Container getOverview(Container content) {

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBackground(Color.GREEN);
        scrollPane.setViewportView(getMainPanel());

        JPanel invitationPanel = getCreateInvitationPanel();
        invitationPanel.setPreferredSize(new Dimension(1, 50));

        content.setLayout(new BorderLayout());
        content.add(scrollPane, BorderLayout.CENTER);
        content.add(invitationPanel, BorderLayout.SOUTH);
        
        return content;
    }

Außerdem hab ich jetzt mal alle pack(), repaint() etc. entfernt. Die waren alle unnötig.
 

Sagattarii

Mitglied
Ja danke, jetzt ist nur noch meine Frage, ob ich es schaffen kann die einzelnen kleinen Panels (im ScrollPane) so groß zu werden wie die ScrollPane?
Zum Beispiel die Breite der ScrollPane abfragen und dann bei PreferedSize der JPanels setzen? Aber wie mache ich das dann mit der Höhe?
Ist das mit dem GridBagLayout, oder halt mit dem GridLayout möglich? Die Container sollen eben alle die gleiche Breite haben (das gesamte Fenster) aber unterschiedlich hoch (je nach Inhalt halt :)). Und halt einfach untereinander dargestellt werden. Oder soll ich da auch irgendwie auf BorderLayout umstellen?

So sieht es bis jetzt aus, also fast so wie ich wollte ^^

attachment.php
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja, die inneren Panels so breit zu machen wie das äußere (d.h. wie das Hauptpanel, das in der ScrollPane liegt) passiert beim GridLayout automatisch - allerdings sind beim GridLayout auch immer alle inneren Panels gleich hoch (und werden ggf. größer, wenn mehr Platz da ist), was ja offenbar nicht gewünscht ist.

Grundsätzlich würde das, was du vorhast vermutlich(!) mit einem GridBagLayout gehen. Das Problem ist: ALLES geht mit einem GridBagLayout ;) und dementsprechend """einfach""" ist es zu verwenden :rolleyes: Bevor du "Totally Gridbag" wirst, kannst du nochmal einen Blick auf das BoxLayout werfen - How to Use BoxLayout (The Java™ Tutorials > Creating a GUI with JFC/Swing > Laying Out Components Within a Container) das ist IMHO einfacher anzuwenden, und KÖNNTE für diesen Fall schon reichen.
 

Sagattarii

Mitglied
Ja, irgendwie ist das Gridbag nicht so toll wenn man das Fenster resized...
Mit BoxLayout klappt fast alles, zumindest sind die Panels nun immer so breit wie das Fenster. Ich würde jetzt gerne nur noch das X Alignment richtig machen, d.h. alles sollte Links am Rand beginnen und nicht wie jetzt genau in die Mitte gezogen werden.

So sieht es bis jetzt aus (die Farben hab ich nun wieder entfernt, aber die Panels gehen über die gesamte Fläche)

attachment.php


Leider hilft auch folgender Code nicht: (Auszug)
Java:
    private static JPanel getMainPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setAlignmentX(0);
        panel.add(getInformationPanel());
        panel.add(getAttendesPanel());
        panel.add(getMeetingsPanel());
        panel.add(getAspectsPanel());
        panel.add(getSeveritiesPanel());
        panel.add(getProductPanel());

        return panel;
    }

Die einzelnen Panels sehen alle so aus:

Java:
    private static JPanel getMeetingsPanel() {
        JLabel title = new JLabel("3");
        JPanel panel = new JPanel();
        panel.setAlignmentX(0);
        panel.add(title);
        return panel;
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
P versch. JPanel Klassen über Menü öffnen AWT, Swing, JavaFX & SWT 12
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
L Swing Jtable über ganzes JPanel AWT, Swing, JavaFX & SWT 7
S JPanel geht über Rand hinaus AWT, Swing, JavaFX & SWT 7
H JPanel über bild AWT, Swing, JavaFX & SWT 2
P JPanel mit Grafik von HDD über JTree AWT, Swing, JavaFX & SWT 10
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
kilopack15 JPanel im laufenden Zustand einfärben AWT, Swing, JavaFX & SWT 2
kilopack15 JPanel Farbverwaltung AWT, Swing, JavaFX & SWT 1
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
L JPanel zeichnet im Konstrukter erzeugten Hintergrund nicht AWT, Swing, JavaFX & SWT 10
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3
F Zeichnung einem JPanel im Layoutmanager zuweisen AWT, Swing, JavaFX & SWT 3
Meeresgott Swing Umgang mit JPanel AWT, Swing, JavaFX & SWT 4
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
J Swing Zeichenfläche im JPanel des Haupfenster anzeigen lassen AWT, Swing, JavaFX & SWT 4
A Swing JPanel zeigt Buttons nicht an AWT, Swing, JavaFX & SWT 4
R JPanel überzeichnet alles? AWT, Swing, JavaFX & SWT 1
D Von JPanel auf anderes JPanel zugreifen AWT, Swing, JavaFX & SWT 9
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
I JPanel - Verwaltung/ Anordnung AWT, Swing, JavaFX & SWT 4
T JComponents zur Laufzeit auf JPanel darstellen AWT, Swing, JavaFX & SWT 10
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
K Swing JPanel ueber komplette Form legen AWT, Swing, JavaFX & SWT 1
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
S jpanel anchor bottom AWT, Swing, JavaFX & SWT 1
thobren Swing Im JPanel wird nur TextArea gelöscht AWT, Swing, JavaFX & SWT 13
A JPanel größe verändern AWT, Swing, JavaFX & SWT 4
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
F JPanel "verschmelzen" GridLayout AWT, Swing, JavaFX & SWT 10
B Dropdown "Einstellungen" auf JPanel, transparent AWT, Swing, JavaFX & SWT 1
D GlassPane für JPanel AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
O 2D-Grafik Zeichenfläche auf JPanel AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben