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

时间:2018-04-26 02:59:25

标签: java swing jscrollpane

我是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);
}
}

有谁能告诉我为什么我的卷轴会水平显示以及如何修复它?任何形式的回应都将受到高度赞赏。

编辑: 对不起。我的问题不完整。我希望这样做,但是使用垂直滚动。

enter image description here

2 个答案:

答案 0 :(得分:2)

它水平显示,因为按钮是水平添加的,因此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);
}

答案 1 :(得分:2)

mark = 0

class illegal(Exception):
    pass

while True:
   try:
       Mark = int(input("Enter a mark out of 100 to see if its valid or not: "))
       if Mark < 0 or 100 < Mark:
           raise illegal
           break
      except illegal:
         print("Invalid mark")

print("Valid mark")

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

//GridLayout grid = new GridLayout(3, 4, 30, 20);
GridLayout grid = new GridLayout(0, 4, 30, 20);

您可以将按钮添加到面板,以便设置面板的布局管理器。否则,JPanel将使用默认的FlowLayout,它显示单行上的所有按钮。