2014-09-28 121 views
0

我有一個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://stackoverflow.com/help/mcve)(最小完整可驗證示例)。 – 2014-09-28 18:01:03

+0

'setVisible(true);'應該在'pack();'之後立即調用' – 2014-09-28 18:29:51

回答

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

注:

  • 通常你不想混亂組件的大小,你有一個佈局管理爲此。我刪除了所有尺寸規格,因爲您沒有指定任何約束,並且通常會導致意外的結果。
  • 類名應該以大寫字母開頭。
  • 你的代碼是一團糟,按邏輯排序(int n = 1在設置組件的中間?)。
+0

非常感謝,我可以做與尺寸約束相同,因爲我的應用程序不正常工作,但滾動現在確定 – Ambuj 2014-09-29 06:34:07

+1

@Ambuj你可以,但爲此,你會需要提出一個新的問題,確定哪些工作無法正常工作,以及您希望如何工作。你需要在那裏發佈相關的代碼。 – user1803551 2014-09-29 13:19:22

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

在'pack'後調用'setSize'使'pack'變成冗餘。 – user1803551 2014-09-29 00:32:26

+0

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