如何垂直滚动到JPanel?

PPB*_*PPB 4 java swing

我使用swing在java中编写了一个代码,这样我就可以在JPanel中添加一个JscrollPane,然后我将以垂直方式添加固定大小的按钮到JPanel

    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);
Run Code Online (Sandbox Code Playgroud)

然后我在运行时添加按钮.

     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;
     }
Run Code Online (Sandbox Code Playgroud)

我想在另一个下面添加一个按钮...(即我想要一个垂直滚动条)

即button1

 button2

   '

   '
Run Code Online (Sandbox Code Playgroud)

但上面的代码给我一行中的按钮(即我得到水平滚动条)即button1 button2 ...

另一个问题是按钮的大小.使用btn.setSize()根本不影响大小......

有谁能够帮我?

use*_*421 7

您必须为面板使用适当的Layoutmanager,如GridLayout,Boxlayout或GridBagLayout.
这取决于你想要放入面板的其他内容.

GridLayout更易于使用IMO:

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

BoxLayout几乎一样容易:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
...
    panel.add(button[i]);
Run Code Online (Sandbox Code Playgroud)

GridBagLayout功能更强大,允许多个列,跨越多个单元的组件,...需要GridBagConstraints来添加元素:

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);
Run Code Online (Sandbox Code Playgroud)

看看本教程:在容器中布置组件(可视指南是一个很好的起点)

编辑:
您也可以手动布局组件,即指定容器中每个组件的位置和大小.为此,您必须将LayoutManager设置为,null以便删除默认管理器.

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]);
Run Code Online (Sandbox Code Playgroud)