在JPanel中滚动不起作用

问题描述:

我有一个JFrame,其中我已经添加了两个JPanel和JScrollPane,一个是JFrame垂直部分的一部分。 然后我添加一个没有。的JPanel(每个包含两个JLabel的流程布局)到这两个JPanel。
达到这一切的事情都很好,但是当没有。的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); 
    } 
+1

您是否可以至少发布一些代码? – Juxhin 2014-09-28 17:28:53

+0

为了更快地获得更好的帮助,请发布[MCVE](http://*.com/help/mcve)(最小完整可验证示例)。 – 2014-09-28 18:01:03

+0

'setVisible(true);'应该在'pack();'之后立即调用' – 2014-09-28 18:29:51

既然你只表示愿意滚动来这里工作是:

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(); 
    } 
} 

注:

  • 通常你不想混乱组件的大小,你有一个布局管理为此。我删除了所有尺寸规格,因为您没有指定任何约束,并且通常会导致意外的结果。
  • 类名应该以大写字母开头。
  • 你的代码是一团糟,按逻辑排序(int n = 1在设置组件的中间?)。
+0

非常感谢,我可以做与尺寸约束相同,因为我的应用程序不正常工作,但滚动现在确定 – Ambuj 2014-09-29 06:34:07

+1

@Ambuj你可以,但为此,你会需要提出一个新的问题,确定哪些工作无法正常工作,以及您希望如何工作。你需要在那里发布相关的代码。 – user1803551 2014-09-29 13:19:22

工作代码
您需要删除以下行

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(); 
} 
} 
+0

在'pack'后调用'setSize'使'pack'变成冗余。 – user1803551 2014-09-29 00:32:26

+0

谢谢,我可以做,而无需删除面板的大小... – Ambuj 2014-09-29 06:35:45