Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout

DaCrazyJavaExpert

Bekanntes Mitglied
Hey,
ich bins wieder. In meinem Projekt möchte ich in einem JScrollPane zwei JPanels haben, in denen jeweils verschiedene Komponenten liegen. Mein Ziel ist es, wenn ím "oberen" JPanel des JScrollPanes ein JButton gedrückt wird, soll automatisch nach unten gescrollt werden, um einen "slide"-Effect zu erzielen*. Allerdings sind die JPanels nicht gleich groß, so dann wenn man bis ganz oben gescrollt hat noch ein Teil des unteren zu sehen ist und umgekehrt. Ich habe meinem JScrollPane in einem JPanel mit dem BorderLayout die BorderLayout.CENTER Ausrichtung gegeben. In dem JScrollPane habe ich noch ein JPanel mit dem BoxLayout. In diesem JPanel liegen dann die Beiden JPanel, welche "gescrollt werden sollen". Mein Problem ist es, dass ich nicht weiß, wie ich die Größe der Beiden JPanels nun anpassen kann, trotz Layout, sodass wenn nach (ganz) oben gescrollt wird ein ganzes JPanel sichtbar ist und wenn nach (ganz) unten gescrollt wird ebenfalls ein ganzes JPanel sichtbar ist.
Hier mein JScrollPane, dem mein JPanel mit den zwei weiteren JPaneln zugewiesen ist:
Java:
this.scrollPaneWlcmFtrs.setViewportView(this.pnlWlcmFtrsBothPages);
Hier das JPanel mit den beiden anderen JPaneln:
Java:
this.pnlWelcomeFeatures.add(lblWelcomeMessage, gbc_lblWelcomeMessage);
Ist vielleicht nicht so interessant für mein Problem, aber... ja.

Vielen Dank!

*Oder ist eine andere Variante, dieses umzusetzten vielleicht besser/eleganter?

EDIT: Feststellung: Wenn ich diesem JScrollPane sein JPanel mit nur einem weiteren JPanel hinzufüge, wird es in voller größe angeziegt, bedeckt also alles, was es soll. Also macht das JScrollPane es irgendwie so, das die JPanels verkleiner (Höhe) werde o.ä..
 
Zuletzt bearbeitet:

Robat

Top Contributor
Wie wäre es mit folgender Idee:
Du hast die JScrollPane mit einer Höhe x.
Du hast ein JPanel als ContentPane im JScrollPane mit der Höhe 2 * x.
Du hast auf deiner ContentPane 2 JPanel die jeweils die Höhe x haben.

Grob gesponnen als Code würde ich sowas machen:
Java:
final int height = 1000;
JPanel contentPane = new JPanel();
contentPane.setPreferredSize(new Dimension(height/2, height));
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));

JScrollPane jsp = new JScrollPane(contentPane);
jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

JPanel upper = new JPanel();
upper.setMaximumSize(new Dimension(height/2, height / 2));
JButton btnDown = new JButton("Scroll down");
btnDown.addActionListener(e -> scrollDown(););
upper.add(btnDown);
contentPane.add(upper);

JPanel lower = new JPanel();
lower.setMaximumSize(new Dimension(height/2, height / 2));
contentPane.add(lower);
 

DaCrazyJavaExpert

Bekanntes Mitglied
Wie wäre es mit folgender Idee:
Du hast die JScrollPane mit einer Höhe x.
Du hast ein JPanel als ContentPane im JScrollPane mit der Höhe 2 * x.
Du hast auf deiner ContentPane 2 JPanel die jeweils die Höhe x haben.

Danke, mit setSize() hat es bei mir vorher irgendwie nicht funktioniert, liegt vielleicht aber auch daran, dass ich die größe von was anderem abhängig machen wollte.
Ich will die Höhe des contentPanes von der Höhe des Frames abhängig machen, allerdings wird mit ein Fehler angezeigt, wenn ich es so versuche:
Java:
private int pnlHeight = frame.getBounds().getHeight();

this.contentPane.setPreferredSize(new Dimension(pnlHeight/2, pnlHeight));
Ich habe die größe des Frames über this.setExtendedState(JFrame.MAXIMIZED_BOTH); und this.setSize(850, 500); festgelegt, sodass beim Starten des Programms das Frame die maximale Größe hat und beim Verkleinern die Größe, die ich mit setSize(); gesetzt habe, hat. Wie kann ich nun die Größe abhängig vom Frame oder am Besten abhängig von der Größe des Platzes für die JScrollPane bekommen? (Meine JScrollPane liegt wie gesagt im CENTER eines Borderlayouts, weshalb "außenherum" noch andere Komponenten Platz finden und somit nicht mehr die Komplette Höhe des Fensters als Höhe der ScrollPane genutzt werden kann.) Vielen Dank!
 

Robat

Top Contributor
mit setSize() hat es bei mir vorher irgendwie nicht funktioniert
Das liegt eher daran, dass nicht alle LayoutManager auf alle setSize() Methoden hören. Welcher LayoutManager wovon abhängt kannst du hier nachschauen.

allerdings wird mit ein Fehler angezeigt
Der da wäre? Ich rate mal ins blaue und sage, dass er meckert weil du versuchst einer lokalen Variable einen Acces-Modifier zugeben. (private muss weg ;) )

Wenn du es wirklich von allem abhängig machen willst musst du jedes mal die Größe der Komponenten neu berechnen wenn sich die Fenstergröße verändert.
Die Höhe / Breite der JScrollPane kannst du dir genau so holen, wie du es dir von dem JFrame holst. (wobei ich eher getBounds().width bzw getBounds().height nehmen würde - ist aber nur eine Präferenz).
 

DaCrazyJavaExpert

Bekanntes Mitglied
Das liegt eher daran, dass nicht alle LayoutManager auf alle setSize() Methoden hören. Welcher LayoutManager wovon abhängt kannst du hier nachschauen.


Der da wäre? Ich rate mal ins blaue und sage, dass er meckert weil du versuchst einer lokalen Variable einen Acces-Modifier zugeben. (private muss weg ;) )

Wenn du es wirklich von allem abhängig machen willst musst du jedes mal die Größe der Komponenten neu berechnen wenn sich die Fenstergröße verändert.
Die Höhe / Breite der JScrollPane kannst du dir genau so holen, wie du es dir von dem JFrame holst. (wobei ich eher getBounds().width bzw getBounds().height nehmen würde - ist aber nur eine Präferenz).
Joa... das klappt bei mir irgendwie nicht so ganz. Jetzt wird einfach eine leere JScrollPane angezeigt. Ich weiß nicht wo ich den Fehler habe, habe ihn irgendwie nicht finden können....Vielleicht liegt es an der Reihenfolge, in der ich die Komponenten befülle, aber das bezweifle ich irgendwie auch weil ja eigentlich die Komponenenten in eine andere Komponente gefüllt werden können, obwohl sie schon vorhanden ist. (Bei mir auch.)
 

Robat

Top Contributor
Ohne Code kann ich dir auch nicht sagen, was du falsch gemacht haben könntest. ;)
In Post#2 habe ich dir aber schon ein funktionierendes Beispiel gezeigt.
 

DaCrazyJavaExpert

Bekanntes Mitglied
Ok, ich zeige hier mal wie ich es ungefähr geregelt habe, ich damit kann mir jemand helfen:
Java:
this.pnlUnderlay.setLayout(new BorderLayout(0, 0)); //Das JPanel auf dem die JScrollPane liegt

this.scrollPaneWlcmFtrs.setBorder(BorderFactory.createEmptyBorder());
        this.scrollPaneWlcmFtrs.setOpaque(false);
        this.scrollPaneWlcmFtrs.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        this.scrollPaneWlcmFtrs.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        this.scrollPaneWlcmFtrs.getVerticalScrollBar().setUnitIncrement(15);
        this.scrollPaneWlcmFtrs.setViewportView(this.pnlWlcmFtrsBothPages);
        this.pnlUnderlay.add(scrollPaneWlcmFtrs, BorderLayout.CENTER); // Die JScrollPane

this.pnlHeight = scrollPaneWlcmFtrs.getBounds().height;
        this.pnlWidth = scrollPaneWlcmFtrs.getBounds().width; // Die initialisierung der Höhe + Weite

this.pnlWlcmFtrsBothPages.setLayout(new BoxLayout(this.pnlWlcmFtrsBothPages, BoxLayout.Y_AXIS));
        this.pnlWlcmFtrsBothPages.setPreferredSize(new Dimension(pnlWidth, pnlHeight));
//Das JPanel auf der JScrollPane mit den zwei weiteren JPaneln

this.pnlWelcomeFeatures.setBackground(Color.DARK_GRAY);
        this.pnlWelcomeFeatures.setMaximumSize(new Dimension(pnlWidth, pnlHeight / 2));
        GridBagLayout gbl_pnlWelcomeFeatures = new GridBagLayout();
        this.pnlWelcomeFeatures.setLayout(gbl_pnlWelcomeFeatures);
        this.pnlWlcmFtrsBothPages.add(this.pnlWelcomeFeatures);//Hier das erste JPanel

this.pnlWelcomeFeaturesNxtPage.setBackground(Color.DARK_GRAY);
        this.pnlWelcomeFeaturesNxtPage.setMaximumSize(new Dimension(pnlWidth, pnlHeight / 2));
        this.pnlWelcomeFeaturesNxtPage.setLayout(new GridLayout(15, 15, 0, 0));
        this.pnlWelcomeFeaturesNxtPage.add(new JButton("Test"));
        this.pnlWelcomeFeaturesNxtPage.add(new JButton("Test2"));
        this.pnlWlcmFtrsBothPages.add(this.pnlWelcomeFeaturesNxtPage);// Und das zweite

this.add(pnlUnderlay, BorderLayout.CENTER);//Und am ende noch alles der Contentpane adden.
Danke
 

Robat

Top Contributor
Okay. Das deine ScrollPane leer erscheint liegt sicherlich daran, dass scrollPane.getBounds().width 0 liefert (genauso wie die height).
Damit wird dann auch die Dimension des Panels in der JScrollPane 0.
Versuch dir mal die Dimension ausgeben zu lassen.


Was funktionieren könnte wäre, wenn du vorher die Größe deiner JScrollPane manuell setzt.
In meinem Beispiel ist die JScrollPane bspw. immer genau so groß wie das JFrame.
Daher kann ich mir die Größe vom JFrame holen und sagen:
Java:
int width = frame.getBounds().width;
int height= frame.getBounds().height;

scrollPane.setSize(width, height);

Dadurch liefern dann die getSize() Methoden (oder der Weg über getBounds() ) auch die richtigen Werte.
Du müsstest jetzt einen Weg finden die Größe deines JScrollPane zu berechnen und so mitzugeben. Ich kenne ja die Abhängigkeiten der einzelnen Komponenten nicht aber da gibt es sicherlich einen geschickten Weg ohne Werte fest einzucoden. (Als kleines Beispiel: Das JFrame hat die Größe X,Y. Das Panel in dem die JScrollPane liegt hat dann meinetwegen die Größe (X, Y/2). Dann kann die JScrollPane die Größe vom JPanel bekommen, usw. usf.)

Hoffe, dass dich das auf den richten Weg gebracht hat.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
raeuchertofu Input bei zwei jTextfields AWT, Swing, JavaFX & SWT 5
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
Z Swing Kann man denn abstand zwischen zwei Buttons berechnen AWT, Swing, JavaFX & SWT 5
M Kommunikation zwischen zwei Stages AWT, Swing, JavaFX & SWT 0
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
L Wörter zwischen zwei Grenzen einlesen. AWT, Swing, JavaFX & SWT 13
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
H Kombination von zwei Frames AWT, Swing, JavaFX & SWT 16
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
D Swing Kommunikation zwischen zwei GUI's AWT, Swing, JavaFX & SWT 2
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
V JavaFX Zwei Dinge in einer CellFactory erledigen AWT, Swing, JavaFX & SWT 8
B Vertikale Größenänderung zwischen zwei Widgets AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
A Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen AWT, Swing, JavaFX & SWT 10
B Swing focusGained öffnet sich zwei mal AWT, Swing, JavaFX & SWT 3
C Bei Btn Klick zwei JPanels switchen AWT, Swing, JavaFX & SWT 14
A Swing zwei JComboBoxen miteinander vergleichen und anschließend Button umwandeln AWT, Swing, JavaFX & SWT 7
A Jtabbed ein Reiter mit zwei icons AWT, Swing, JavaFX & SWT 4
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
B Kommunikation zwischen zwei Fenstern und vorübergehende Speicherung der Eingaben AWT, Swing, JavaFX & SWT 4
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
T LayoutManager GridBagLayout - zwei jTable mit unterschiedlicher Höhe AWT, Swing, JavaFX & SWT 2
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
J JOptionPane mit zwei Buttons?! AWT, Swing, JavaFX & SWT 3
F Swing Ladebildschirm zwischen zwei SWING Frames AWT, Swing, JavaFX & SWT 11
T JTabbedPane - neuen Tab zwischen zwei anderen Tabs hinzufügen AWT, Swing, JavaFX & SWT 2
Helgon Zwei jTables gleich Breit AWT, Swing, JavaFX & SWT 4
C Zwei Bilder übereinander legen AWT, Swing, JavaFX & SWT 1
A Daten umherschieben zwischen zwei Klassen AWT, Swing, JavaFX & SWT 40
M Swing Zwei Jlists - selectedElement binden? AWT, Swing, JavaFX & SWT 7
K zwei TableModel AWT, Swing, JavaFX & SWT 9
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
F JPanel mit zwei Methoden her beschreiben. AWT, Swing, JavaFX & SWT 8
Y xormode bzw bild in zwei ebenen zeichnen AWT, Swing, JavaFX & SWT 4
G ein JTextArea in zwei JPanels AWT, Swing, JavaFX & SWT 2
G Wie erzeugt man zwei identische JPanel AWT, Swing, JavaFX & SWT 4
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
B LayoutManager Positionierung zwischen zwei Layoutkomponenten AWT, Swing, JavaFX & SWT 2
N Swing DnD zwischen zwei JTrees AWT, Swing, JavaFX & SWT 2
H Swing Zwei Fragen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
C Zwei JSpinner mit dem gleichen Wert AWT, Swing, JavaFX & SWT 2
T Zwei Jtables eine JscrollPane AWT, Swing, JavaFX & SWT 3
L Zwei Anwendungen kommen sich in die Quere! AWT, Swing, JavaFX & SWT 4
M SWT DND zwischen zwei TreViewern in beide Richtungen AWT, Swing, JavaFX & SWT 10
S SWT Zwei Tabellen gleichzeitig Scrollen AWT, Swing, JavaFX & SWT 3
N zwei JComponente gleichzeitig auf JPanel hinzufügen AWT, Swing, JavaFX & SWT 22
N Ein Button für zwei Aktionen AWT, Swing, JavaFX & SWT 7
V Swing Auslösen von zwei Events hintereinander AWT, Swing, JavaFX & SWT 4
hdi SWT Zwei mal Shell öffnen = Exception AWT, Swing, JavaFX & SWT 6
algorismi Unterscheiden zwischen zwei JLists AWT, Swing, JavaFX & SWT 5
P GridBagLayout - zwei Spalten mit gleicher Größe AWT, Swing, JavaFX & SWT 11
H Ein Button - zwei Actions AWT, Swing, JavaFX & SWT 3
T Schieberegler mit zwei Schiebern AWT, Swing, JavaFX & SWT 2
M SWT SWT - Zwei Tabellen gleicher Größe AWT, Swing, JavaFX & SWT 5
S import von Klassen (zwei Panels eine Form) AWT, Swing, JavaFX & SWT 39
K Zwei Panels zentriert anordnen AWT, Swing, JavaFX & SWT 3
S Vereinen von zwei MenuBar AWT, Swing, JavaFX & SWT 3
P JList mit zwei Werten AWT, Swing, JavaFX & SWT 9
0 JMenuItem nicht in zwei JMenus möglich? AWT, Swing, JavaFX & SWT 2
G Variblenwert zwischen zwei Klassen übergeben AWT, Swing, JavaFX & SWT 3
B zwei JLabels überlappen lassen AWT, Swing, JavaFX & SWT 5
T Kommunikation zwischen Zwei GUI-Klassen AWT, Swing, JavaFX & SWT 2
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
T Kommunikation zwischen zwei jFrames AWT, Swing, JavaFX & SWT 4
G Datenaustausch zwischen zwei JFrames AWT, Swing, JavaFX & SWT 3
K Zwei JFrames aneinanderdocken? AWT, Swing, JavaFX & SWT 5
A Eins von zwei offnen Fenster/Frames schließen AWT, Swing, JavaFX & SWT 2
S JTable zwei Text-Zeilen in einer Zelle AWT, Swing, JavaFX & SWT 2
hdi zeitgleiches fokusieren von zwei panels AWT, Swing, JavaFX & SWT 2
I JTable: "GLEICHZEITIG" zwei verschiedene TableMode AWT, Swing, JavaFX & SWT 2
R JDialog dispose() wird zwei mal aufgerufen AWT, Swing, JavaFX & SWT 2
T zwei panel und ein thread AWT, Swing, JavaFX & SWT 5
W Instanz eines Steuerelementes an zwei Stellen zeichnen AWT, Swing, JavaFX & SWT 3
M Zwei JMenuBars AWT, Swing, JavaFX & SWT 5
W JTree - aus zwei mach eins AWT, Swing, JavaFX & SWT 2
M Zwei Element auf ein Contentpane AWT, Swing, JavaFX & SWT 45

Ähnliche Java Themen

Neue Themen


Oben