Hallo,
ich habe folgendes Konzept.
Ein JPanel (panelView) bestehend aus:
- einem JScrollPanel welches ein JPanel beinhaltet welches den eigentlichen Inhalt darstellt (panelContent)
- einem JPanel welches als Art "Fussleiste" dient und Buttons beinhaltet (panelFooter).
Die Pannels werden alle mit GroupLayout zusammengekleistert. Beim panelContent ist GroupLayout "zwingend". panelFooter und panelView sind GroupLayout historisch bedingt... es dürfen auch gerne andere Layout-Manager sein.
Ich habe nun das Problem, das wenn in meinem Content-Panel vertikal wenig Daten dargestellt werden, das Panel nur bis zur Mitte des Bildschirms geht. Verkleinert man das Fenster nun, habe ich den horizontalen Scrollbalken des JScrollPane in der Mitte des Bildschirms.
Wie kann ich mein panelContent so vertikal "auffüllen", das es immer bis zum Button geht?
Wird vertikal genug Inhalt dargestellt, ist irgendwann die Scrollbar über den Buttons - das soll sie aber immer sein.
Ich habe schon
am Ende der vertikalen Gruppe des panelContent probiert - das bringt aber leider nichts. Anstelle der 0 mit echten Werten wie 800 für minal und preferred Gap klappt es zwar, aber das ist ja Mist - da geht ja jede Dynamik beim resize verloren.
Zum selber anschauen:
Bildchen:
PS: falls die Frage auskommt "Warum denn JPanel im JPanel" - Ja, es geht auch alles in einem einzigen JPanel mit JScrollPane, dann scrollen sich vertikal aber auch meine Buttons der Fussleiste mit - die sollen aber nicht Scrollbar sein
ich habe folgendes Konzept.
Ein JPanel (panelView) bestehend aus:
- einem JScrollPanel welches ein JPanel beinhaltet welches den eigentlichen Inhalt darstellt (panelContent)
- einem JPanel welches als Art "Fussleiste" dient und Buttons beinhaltet (panelFooter).
Die Pannels werden alle mit GroupLayout zusammengekleistert. Beim panelContent ist GroupLayout "zwingend". panelFooter und panelView sind GroupLayout historisch bedingt... es dürfen auch gerne andere Layout-Manager sein.
Ich habe nun das Problem, das wenn in meinem Content-Panel vertikal wenig Daten dargestellt werden, das Panel nur bis zur Mitte des Bildschirms geht. Verkleinert man das Fenster nun, habe ich den horizontalen Scrollbalken des JScrollPane in der Mitte des Bildschirms.
Wie kann ich mein panelContent so vertikal "auffüllen", das es immer bis zum Button geht?
Wird vertikal genug Inhalt dargestellt, ist irgendwann die Scrollbar über den Buttons - das soll sie aber immer sein.
Ich habe schon
Java:
.addGap(0, 0, Short.MAX_VALUE)
am Ende der vertikalen Gruppe des panelContent probiert - das bringt aber leider nichts. Anstelle der 0 mit echten Werten wie 800 für minal und preferred Gap klappt es zwar, aber das ist ja Mist - da geht ja jede Dynamik beim resize verloren.
Zum selber anschauen:
Java:
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.border.TitledBorder;
public class Test {
public static void main(String[] args) {
doFrame();
}
static private void doFrame() {
JLabel monthLabel = new JLabel("Monat");
JTextField monthField = new JTextField(20);
monthField.setMaximumSize(new Dimension(monthField.getMaximumSize().width, monthField
.getPreferredSize().height));
JLabel yearLabel = new JLabel("Jahr");
JTextField yearField = new JTextField(20);
yearField.setMaximumSize(new Dimension(yearField.getMaximumSize().width, yearField
.getPreferredSize().height));
JButton searchButton = new JButton("Suche");
JFrame frame;
JButton saveButton = new JButton("Speichern");
JButton cancelButton = new JButton("Abbrechen");
JLabel label1 = new JLabel("1");
JLabel label2 = new JLabel("2");
JLabel text1 = new JLabel("10");
JLabel text2 = new JLabel("10");
frame = new JFrame("test");
frame.setSize(1024, 768);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
JPanel panelContent = new JPanel();
GroupLayout layoutContent = new GroupLayout(panelContent);
panelContent.setLayout(layoutContent);
layoutContent.setAutoCreateGaps(true);
layoutContent.setAutoCreateContainerGaps(true);
layoutContent.setHorizontalGroup(layoutContent.createSequentialGroup().addGroup(
layoutContent.createParallelGroup(GroupLayout.Alignment.CENTER)
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(
layoutContent.createSequentialGroup()
.addComponent(yearLabel)
.addComponent(yearField, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
20, 20)
.addComponent(monthLabel)
.addComponent(monthField, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
20, 20).addComponent(searchButton))
.addGroup(
layoutContent.createSequentialGroup()
.addGroup(
layoutContent.createParallelGroup().addComponent(label1)
.addComponent(label2))
.addGroup(
layoutContent.createParallelGroup().addComponent(text1)
.addComponent(text2)))));
layoutContent.setVerticalGroup(layoutContent
.createSequentialGroup()
.addGroup(
layoutContent.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(yearLabel).addComponent(yearField)
.addComponent(monthLabel).addComponent(monthField)
.addComponent(searchButton))
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 20, 20)
.addGroup(
layoutContent.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(
layoutContent.createSequentialGroup()
.addGroup(
layoutContent.createParallelGroup(
GroupLayout.Alignment.CENTER)
.addComponent(label1).addComponent(text1))
.addGroup(
layoutContent.createParallelGroup(
GroupLayout.Alignment.CENTER)
.addComponent(label2).addComponent(text2)))));
JPanel panelFooter = new JPanel();
GroupLayout layoutFooter = new GroupLayout(panelFooter);
panelFooter.setLayout(layoutFooter);
layoutFooter.setAutoCreateGaps(true);
layoutFooter.setAutoCreateContainerGaps(true);
layoutFooter.setHorizontalGroup(layoutFooter.createSequentialGroup().addGroup(
layoutFooter.createParallelGroup(GroupLayout.Alignment.CENTER)
.addGroup(
layoutFooter
.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(
layoutFooter.createParallelGroup().addComponent(
cancelButton))
.addGroup(
layoutFooter.createParallelGroup().addComponent(
saveButton)))));
layoutFooter.setVerticalGroup(layoutFooter
.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(
layoutFooter.createParallelGroup().addGroup(
layoutFooter.createSequentialGroup().addGroup(
layoutFooter.createParallelGroup()
.addComponent(cancelButton)
.addComponent(saveButton)))));
JPanel panelView = new JPanel();
JScrollPane scrollPane = new JScrollPane(panelContent);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
GroupLayout layoutView = new GroupLayout(panelView);
panelView.setLayout(layoutView);
layoutView.setHorizontalGroup(layoutView.createSequentialGroup().addGroup(
layoutView.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(scrollPane).addComponent(panelFooter)));
layoutView.setVerticalGroup(layoutView.createSequentialGroup().addComponent(scrollPane)
.addComponent(panelFooter));
panelContent.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10,
10, 10), BorderFactory.createTitledBorder(BorderFactory.createRaisedBevelBorder(),
"Lorem Ipsum", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION,
new Font("Serif", Font.BOLD, 16))));
frame.add(panelView);
frame.setVisible(true);
}
}
Bildchen:
PS: falls die Frage auskommt "Warum denn JPanel im JPanel" - Ja, es geht auch alles in einem einzigen JPanel mit JScrollPane, dann scrollen sich vertikal aber auch meine Buttons der Fussleiste mit - die sollen aber nicht Scrollbar sein