滚动JPanel无法正常工作

时间:2014-09-28 17:23:31

标签: java swing jpanel jscrollpane

我有一个JFrame,我在其中添加了两个JPanel和JScrollPane,一半是JFrame的垂直部分。 然后我加了一个。 JPanel(每个包含两个JLabel在flowlayout中)到这两个JPanel 一切都很好,但是当没有。 JPanel增加,JPanel的大小减少而滚动不起作用。 你能帮我找出为什么滚动不起作用。

以下是一些只有一个JPanel

的代码
class scrol extends JFrame
 {

  scrol()
   {

     //getContentPane().setLayout(new GridLayout(1,2));
     JPanel p1=new JPanel();
     p1.setLayout(new GridLayout(0,1));
     p1.setPreferredSize(new Dimension(300,350));
     int n=1;
     p1.setBorder(BorderFactory.createLineBorder(new Color(200,167,0)));
     JScrollPane scrol1=new JScrollPane(p1);
     scrol1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
//scrol1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
     scrol1.setBounds(0,0,420,405);
     getContentPane().add(scrol1,BorderLayout.CENTER);
     while(n<100)
      {
       n=n+1;
       p1.add(new JPanel().add(new JLabel("hello")));
     }
     pack();

     setSize(500,500);
     setVisible(true);
  }

2 个答案:

答案 0 :(得分:0)

工作代码
您需要删除以下

 p1.setPreferredSize(new Dimension(300,350));

并且您可以在while循环中添加以下代码来控制大小,尽管它也可以在没有此代码的情况下工作

  tempP.setPreferredSize(new Dimension(10, 30));
下面的

是带有更改的工作代码

class Scrol extends JFrame
{

Scrol()
{

 //getContentPane().setLayout(new GridLayout(1,2));
 JPanel p1=new JPanel();
 p1.setLayout(new GridLayout(0,1));
// p1.setPreferredSize(new Dimension(300,350));
 int n=1;
 p1.setBorder(BorderFactory.createLineBorder(new Color(200,167,0)));
 JScrollPane scrol1=new JScrollPane(p1);
 scrol1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
 //scrol1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
 //scrol1.setBounds(0,0,420,405);
 getContentPane().add(scrol1,BorderLayout.CENTER);
 while(n<200)
  {
   n=n+1;
   JPanel tempP=new JPanel();
   tempP.setPreferredSize(new Dimension(10, 30));
   p1.add(tempP.add(new JLabel("hello")));
 }
 pack();

 setSize(500,500);
 setVisible(true);
}

 public static void main(String[] args) {
new Scrol();
 }
 }

答案 1 :(得分:0)

由于您只是表示您希望滚动在此处工作,因此它是:

public class Scrol extends JFrame {

    Scrol() {

        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(0, 1));
        p1.setBorder(BorderFactory.createLineBorder(new Color(200, 167, 0)));
        getContentPane().add(new JScrollPane(p1), BorderLayout.CENTER);

        for (int n = 1; n < 100; n++)
            p1.add(new JPanel().add(new JLabel("hello")));

        setSize(500, 500); // or pack()
        setVisible(true);
    }

    public static void main(String[] args) {

        new Scrol();
    }
}

备注:

  • 通常你不想弄乱组件&#39;大小,你有一个布局管理器。我删除了所有尺寸规格,因为您没有指定任何约束,它们通常会导致意外结果。
  • 类名称应以大写字母开头。
  • 您的代码是一团糟,在逻辑上对其进行排序(int n = 1在设置组件的过程中?)。