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()方法
- public Dimension preferredSize() {
- /* Avoid grabbing the lock if a reasonable cached size value
- * is available.
- */
- Dimension dim = prefSize;//獲取默認prefSize
- if (dim == null || !(isPreferredSizeSet() || isValid())) {
- synchronized (getTreeLock()) {
- prefSize = (peer != null) ?
- peer.getPreferredSize() :
- getMinimumSize();
- dim = prefSize;
- }
- }
- return new Dimension(dim);
- }
此時設置panel的prefSize值,JScrollPane就不會計算panel的大小,panel的組件如果超出panel的寬度,流佈局就會自動轉行。
不過,這樣設置的效果是,JScrollPane的豎方向也不會計算panel的大小,一旦panel的組件過多,導致超出panel的高度,滾動條也不會顯示,可以手動計算panel的組件數量佈局,然後設置panel的prefSize。
- private void resize()
- {
- int nums = panel.getComponentCount(); //組件數量
- //100 添加的組件長和寬, 5是流佈局FlowLayout的默認組件間隔
- int h = (nums / (panel.getWidth() / (100+5))) * (100 + 5);
- panel.setPreferredSize(new Dimension(100, h));
- //手動設置panel的首選大小,如果不需要橫向滾動,width的值可以設置和前面默認一樣
- updateUI();
- }