Swing Panel mit ScrollBar

AleexQo

Mitglied
Hey Leute,

ich habe ein Panel als Hintergrund. Darauf will ich ein weiteres Panel mit FlowLayout platzieren, welches mehrere JButtons enthält (Beispielsweise 10). Das Panel soll jedoch nur 4 oder 5 Knöpfe anzeigen und um die restlichen sehen zu können, soll man nach rechts scrollen können.
Meine Ideen:
1. Ich wollte dem Panel mit den JButtons einfach eine ScrollBar hinzufügen, leider hat das nicht funktioniert.
2. Ich habe ein JScrollPane erzeugt und diesem mein ButtonPanel hinzugefügt. Daraufhin hat mein JFrame aber nur meinen Hintergrund angezeigt.

Habt ihr eine Lösung?

Danke euch schon mal im voraus😀
 
mit jScrollPane.add(thePanel) (falsch)
oder jScrollPane.setViewportView(thePanel); (richtig)

Hab das so gemacht:
JScrollPane startScrollPane1 = new JScrollPane(startPanel1);
und dann nochmal:
startScrollPane1.add(startPanel1);

Habe das nun so gemacht, wie du es mir gesagt hast.
Danke! Es funktioniert. Jedoch nicht mit einer ScrollBar, sondern das FlowLayout des Panels schiebt die Buttons einfach in die nächste Zeile.
Wie schaffe ich es, die Buttons alle neben einander anzuordnen, ohne dass das FlowLayout diese in die nächste Zeile schiebt und diese mit Hilfe einer Scrollbar durchzuscrollen.
 
Zuletzt bearbeitet:
Zeig mal mehr Code.
Das hier funklioniert wie erwartet. Die JButtons werden in einer Zeile angeordnet, und man kann mit den JScrollBars die Zeile entlang scrollen.
Java:
package javaforum;
import javax.swing.*;

public class FlowLayoutInJScrollPane {

    public static void main(String[] args){
        JFrame f = new JFrame();
        JPanel p = new JPanel();
        for(int i = 0; i < 60; i++){
            p.add(new JButton("Dies ist Button " + i));
        }
        JScrollPane jsp = new JScrollPane(p);
        f.getContentPane().add(jsp);
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
 
Das hier funklioniert wie erwartet.

Ich zeige dir gerne mehr Code, aber das Problem, das ich habe liegt daran dass ich die ScrollPane (welche das Panel mit den Buttons enthält), einem anderen Panel hinzufüge und nicht dem JFrame.

Ich habe ein JFrame in dem ich mit einem CardLayout zwischen Panels wechseln kann und auf einem von diesen Panels ist ein JLabel und dann soll die JScrollPane kommen.
Ich bekomme eine Scrollbare anzeige der Knöpfe auch hin, aber nicht wenn ich die ScrollPane einem Panel adde.

Java:
    JFrame jf = new JFrame("Projekt");
    CardLayout cardLay = new CardLayout();
    JPanel panelMain = new JPanel(cardLay);
    JPanel panels [] = new JPanel[5];
    JButton start = new JButton("Str");
    JButton suche = new JButton("Srch");
    JButton playlists = new JButton("PL");
    JButton meinProfil = new JButton("MP");
    JButton aboFr = new JButton("A & F");
    JButton startBtns1 [] = new JButton[10];
    Dimension dim = new Dimension (325, 475);
    Color co = new Color(205, 133, 63);
   
    public DasFrame() {

        jf.setTitle("Projekt");

        jf.setVisible(true);
        jf.setSize(325, 475);
        jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setResizable(true);
        jf.setLayout(new BorderLayout());
       
        // Panel mit den Buttons erstellen
        JPanel panelBtn = new JPanel(new FlowLayout());
        panelBtn.add(start);
        panelBtn.add(suche);
        panelBtn.add(playlists);
        panelBtn.add(meinProfil);
        panelBtn.add(aboFr);
        jf.add(panelBtn, BorderLayout.SOUTH);
       
        //panel mit cardLayout hinzufügen
        jf.add(panelMain);
       
       
        //btns panelwechsel
        start.addActionListener((ActionEvent e) -> cardLay.first(panelMain));
        suche.addActionListener((ActionEvent e) -> cardLay.next(panelMain));
        playlists.addActionListener((ActionEvent e) -> cardLay.next(panelMain));
        meinProfil.addActionListener((ActionEvent e) -> cardLay.previous(panelMain));
        aboFr.addActionListener((ActionEvent e) -> cardLay.previous(panelMain));
       
        //panels für das CardLayout
        for(int i=0;i<5;i++){
            panels[i] = new JPanel();
            panels[i].setBackground(co);
            panels[i].setPreferredSize(dim);
            panelMain.add(panels[i]);
        }
       
        //erstes Label für die Startseite (panels[0])
        JLabel startLabels[] = new JLabel[3];
        startLabels[0] = new JLabel("Diese Woche angesagt:\n");
        startLabels[0].setPreferredSize(new Dimension(200, 55));
        Font schrift = (startLabels[0].getFont().deriveFont(Font.PLAIN, 50));
        startLabels[0].setForeground(Color.WHITE);
        panels[0].add(startLabels[0]);
       
        //erstes Panel für die Startseite
        JPanel startPanels[] = new JPanel[3];
        startPanels[0] = new JPanel();
        startPanels[0].setLayout(new FlowLayout());
        startPanels[0].setBackground(co);
        startPanels[0].setPreferredSize(new Dimension(100, 60));
       
        //scrollpane fürs panel
        JScrollPane jspStart[] = new JScrollPane[3];
        jspStart[0] = new JScrollPane();
        jspStart[0].setBackground(co);
        jspStart[0].setPreferredSize(new Dimension(100,60));
        jspStart[0].setPreferredSize(dim);
        jspStart[0].setHorizontalScrollBarPolicy
                (JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
       
       
       
       
        //knöpfe für das erste Panel
        for(int i=0;i<10;i++){
            startBtns1[i] = new JButton(i + ".");
            startBtns1[i].setPreferredSize(new Dimension(50, 50));
            startPanels[0].add(startBtns1[i]);
        }
       
        //panels dem jFrame adden
        jspStart[0].setViewportView(startPanels[0]);
        panels[0].add(jspStart[0]);
       
       
//        jspStart[0].setBorder(null);
       
       
//        jf.repaint();
        jf.pack();
        jf.setVisible(true);
 
Okay, ich habe nun die Lösung.
Es funktioniert nicht, wenn das JPanel, welchem ich die JScrollPane hinzufüge, ein FlowLayout besitzt.
Wählt man stattdessen ein GridLayout, funktioniert es.
 

Zurück
Oben