I have been looking for a way to add a vertical scroll bar to a JPanel
that in turn is added to a CardLayout
panel. I looked up all the posts around here that were concerned with implementing a scrollable JPanel
but I couldn't figure out how to implemented it with this specific CardLayout
. Oracle doesn't give an example that I could use either.
Perhaps I don't use the right configuration for the JWindow
or any other component that Im using.
I have placed below a stripped-down version of my program for which I'd like to implement a vertical scroll bar.
My question is how to implement JPanelScrollable
class at the bottom of the code so that it can become scrollable ?
import javax.swing.*;
import java.awt.*;
import java.net.URL ;
public class Program2 extends JFrame
{
public Program2()
{
super("Flash CC");
Container2 container = new Container2();
setSize(700, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setFocusable( true ) ;
add(container);
setVisible(true) ;
}
public static void main(String[] args)
{
Program2 prog = new Program2();
}
}
class Container2 extends JPanel
{
private CardLayout cardLayout = new CardLayout() ;
private JPanel1 jPanelFirst = new JPanel1() ;
private JPanel2 jPanelSecond = new JPanel2() ;
private JPanelScrollable jPanelThird = new JPanelScrollable() ;
//Constructor
Container2()
{
this.setLayout( cardLayout ) ;
this.setFocusable( true ) ;
JScrollPane scrollFrame = new JScrollPane(jPanelThird);
this.add( jPanelFirst, "first card" ) ;
this.add( jPanelSecond, "second card" ) ;
this.add( scrollFrame , "third card" ) ;
cardLayout.show( this, "third card" ) ;
}
}
class JPanel1 extends JPanel
{
}
class JPanel2 extends JPanel
{
}
class JPanelScrollable extends JPanel
{
// here many, many, many elemnts will go
// and a vertical scroll barr is needed to view'm all.
JPanelScrollable()
{
this.setOpaque( true ) ;
this.setLayout( null ) ;
for(int i=0; i<30; i++)
{
JButton b = new JButton("Button" + i) ;
b.setBounds(0, (i * 100), 100, 50) ;
this.add(b) ;
}
}
}
The
Container.add(...)
method accepts any component. A CardLayout is not restricted to panels.Add the panel to a JScrollPane and add the scroll pane to the card layout.
If you're using eclipse, consider using WindowBuilder. It's free and allows you to do what you need by dragging and dropping and changing some properties.
Add the panel to a JScrollPane
Add the scroll pane to the CardLayout
See How to use scroll panes for more details
Updated with working example