Swing中JScrollPane添加JPanel設置setPreferredSize問題

panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
Dimension ds = new Dimension(100, 100);
panel.setPreferredSize(ds);
jspane.setViewportView(panel);

上面的代碼是在jspane的滾動視圖組件中添加一個流式佈局的JPanel。然後設置一個panel的prefSize首選值。

在java api中這樣解釋:

setPreferredSize
public void setPreferredSize(Dimension preferredSize)設置此組件的首選大小。如果 preferredSize爲 null,則要求 UI 提供首選大小。

就是說如果不提供這個值,ui會進行計算並設置這個值,這裏,會根據jspane的ui來設置值。(默認的JScrollPane組件是自動添加橫豎滾動條的)

panel中添加組件,默認FlowLayout佈局器會進行流式佈局,這裏定義是左對齊。如果沒有設置prefSize值,則使用根據JScrollPane組件jspane的ui自動進行計算的首選大小prefSize。而JScrollPane組件默認是會進行滾動顯示,所以,如果panel中添加的組件過多導致超出了panel的寬度,JScrollPane的ui會計算一個合適的prefSize值來提供給panel組件,此時,panel的流佈局會一直在同一水平方向佈局,而不會換行。如下圖顯示:


就算取消了JScrollPane的橫向滾動條,panel也不會進行換行佈局,此時獲取panel的prefSize也會遠遠大於panel的默認長寬

java.awt.Dimension[width=6845,height=110]

Component中的preferredSize()方法

  1. public Dimension preferredSize() {  
  2.         /* Avoid grabbing the lock if a reasonable cached size value 
  3.          * is available. 
  4.          */  
  5.         Dimension dim = prefSize;//獲取默認prefSize  
  6.         if (dim == null || !(isPreferredSizeSet() || isValid())) {  
  7.             synchronized (getTreeLock()) {  
  8.                 prefSize = (peer != null) ?  
  9.                     peer.getPreferredSize() :  
  10.                     getMinimumSize();  
  11.                 dim = prefSize;  
  12.             }  
  13.         }  
  14.         return new Dimension(dim);  
  15.     }

此時設置panel的prefSize值,JScrollPane就不會計算panel的大小,panel的組件如果超出panel的寬度,流佈局就會自動轉行。
不過,這樣設置的效果是,JScrollPane的豎方向也不會計算panel的大小,一旦panel的組件過多,導致超出panel的高度,滾動條也不會顯示,可以手動計算panel的組件數量佈局,然後設置panel的prefSize。

  1. private void resize()  
  2. {  
  3.    int nums = panel.getComponentCount();  //組件數量
  4.    //100 添加的組件長和寬, 5是流佈局FlowLayout的默認組件間隔  
  5.    int h = (nums / (panel.getWidth() / (100+5))) * (100 + 5);  
  6.    panel.setPreferredSize(new Dimension(100, h)); 
  7.    //手動設置panel的首選大小,如果不需要橫向滾動,width的值可以設置和前面默認一樣  
  8.    updateUI();  
  9. }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章