Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do i get vertical scrolling to JPanel?

Tags:

java

swing

I have written a code in java using swing, so that I will have a JscrollPane added to JPanel and then I will add buttons of fixed size to JPanel in vertical fashion

    JPanel panel=new JPanel();
    panel.setBackground(Color.WHITE);

    int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
    int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
    JScrollPane jsp=new JScrollPane(panel,v,h);
    jsp.setPreferredSize(new Dimension(600,600));
    jsp.setBounds(150,670,850,200);
    frame.add(jsp);

then I am adding buttons to it at run time.

     for(i=0;i<n;i++) 
    {
         button[i]=new JButton();
         button[i].setBounds(20,y,120,120);
         button[i].setSize(120,120);
         button[i].setToolTipText(file[i].toString());       
         button[i].setIcon(Icon);
         panel.add(button[i]);   
         y=y+140;
     }

I want to add a buttons one below the other...(i.e I want a vertical scrollbar)

i.e. button1

 button2

   '

   '

but above code is giving me buttons in a line (i.e. I am getting horizontal scrollbar) i.e. button1 button2...

another problem is the size of the buttons. Using btn.setSize() is not affecting size at all...

can anybody help me?

like image 931
PPB Avatar asked Feb 18 '10 10:02

PPB


3 Answers

You must use an appropriate Layoutmanager like GridLayout, Boxlayout or GridBagLayout for the panel.
It depends what else you want to put into the panel.

GridLayout is easier to use IMO:

JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 1));  // any number of rows, 1 column
...
    panel.add(button[i]);

BoxLayout is almost as easy:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
...
    panel.add(button[i]);

GridBagLayout is more powerful, allowing more than one column, components spanning more than one cell, ... needs a GridBagConstraints to add the elements:

JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints(
    0, RELATIVE,    // x = 0, y = below previous element
    1, 1,           // cell width = 1, cell height = 1
    0.0, 0.0        // how to distribute space: weightx = 0.0, weighty = 0,0 
    GridBagConstraints.CENTER,  // anchor
    GridBagConstraints.BOTH,    // fill
    new Insets(0, 0, 0, 0),     // cell insets
    0, 0);          // internal padding
...
    panel.add(button[i], constraints);

Have a look at this tutorial: Laying Out Components Within a Container (The visual guide is a good start point)

EDIT:
you can also lay out the components by hand, that is, specify the location and size of each component in the container. For this you must set the LayoutManager to null so the default manager gets removed.

JPanel panel = new JPanel();
panel.setLayout(null);
...
    button[i].setLocation(x, y);
    button[i].setSize(width, heigth);
    // OR button[i].setBounds(x, y, width, height);
    panel.add(button[i]);
like image 159
user85421 Avatar answered Nov 11 '22 07:11

user85421


You need to define an appropriate LayoutManager for your JPanel, which is responsible for how the Components added to it are positioned. The default LayoutManager is FlowLayout, which lays out Components left-to-right. For laying out Components vertically you should consider using BoxLayout or GridBagLayout.

like image 43
Adamski Avatar answered Nov 11 '22 06:11

Adamski


You have to set LayoutManager for JPanel or use Box(BoxLayout.Y_AXIS) instead.

like image 1
skyman Avatar answered Nov 11 '22 07:11

skyman