使 Java JScrollpane 垂直滚动而不是水平滚动

Make Java JScrollpane scroll vertically instead of horizontally

我是 Java 的新手,目前正在努力学习。我正在开发一个简单的程序来在框架上显示多个按钮。我还想让面板垂直滚动,但它是水平滚动的。

到目前为止,这是我的代码:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class GridView {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    JFrame frame = new JFrame("Display Buttons");
    frame.setBounds(30, 30, 300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout grid = new GridLayout(3, 4, 30, 20);
    Container content = frame.getContentPane(); 
    content.setLayout(grid); 
    JPanel panel = new JPanel();
    JButton button = null;
    for (int i = 1; i <= 100; i++) {
        panel.add(button = new JButton(" Press " + i));
    }
    content.add(panel);
    frame.add(panel, BorderLayout.NORTH);
    frame.add(new JScrollPane(panel), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}
}

谁能告诉我为什么我的滚动条水平显示,如何解决?任何类型的回复将不胜感激。

编辑: 对不起。我的问题不完整。我想把它做成这样,但是有垂直滚动。

它水平显示,因为按钮是水平添加的,所以 panel 的宽度超过了视口。
如果您通过使用不同的布局管理器垂直添加按钮,则滚动窗格将垂直显示。例如:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));  //or setLayout(grid); if you meant to use tge gridlayout for the buttons 
/*JButton button = null;*/ //never used
for (int i = 1; i <= 100; i++) {
    panel.add(new JButton(" Press " + i));
}

编辑 以回答编辑后的问题。查看评论:

public static void main(String[] args) {

    JFrame frame = new JFrame("Display Buttons");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout grid = new GridLayout(0, 4, 30, 20);
    JPanel panel = new JPanel(grid);
    for (int i = 1; i <= 100; i++) {
        panel.add(new JButton(" Press " + i));
    }

    JScrollPane sp = new JScrollPane(panel);
    //by default scrollpane will appear as needed, vertically AND horizontally
    //to prevent it from showing horizontally :
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    frame.add(sp, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}
//GridLayout grid = new GridLayout(3, 4, 30, 20);
GridLayout grid = new GridLayout(0, 4, 30, 20);

如果您想要组件的列,则不要在布局管理器中指定行值。只需指定列,组件将在需要时换行

//content.setLayout(grid); 
//JPanel panel = new JPanel();
JPanel panel = new JPanel(grid);

您将按钮添加到面板,因此您需要设置面板​​的布局管理器。否则 JPanel 将使用默认的 FlowLayout,它将所有按钮显示在一行上。