2010-10-05 130 views
3

我有一個含有面板的JPanel與流佈局,含面板處於JScrollPane的,含有面板的保持一堆其他JPanels,內部面板,在其中。所有內部面板都具有相同的尺寸。如果有更多的面板則含有面板可以在保持其寬度然後將它們向下網格化,並且如果有更多的面板然後將含有面板可以以其高度保持,則內板對準在同一個網格中,除了以最後一行爲中心的最後一行之外。調整大小與流佈局面板不調用滾動條

雖然我調整包含面板擴展對話框和佈局流佈局履行其職責,但儘管面板的大小超過JScrollPane的的邊界滾動條不會出現。

當我動態調整包含面板的尺寸時,如何控制滾動條的外觀?

爲圖像,他們應該總結一下:

alt text

擴展對話框後寬度:

alt text

亞當

+1

自包含的最小代碼示例可以幫助人們更容易地理解您的問題。 – 2010-10-05 22:53:43

+0

「網格向下」是什麼意思?截圖也將有所幫助。一般而言,您可以使用動態佈局或滾動,但不能同時使用兩者。 – 2010-10-06 01:53:23

+0

有趣的是,我從來沒有使用過'FlowLayout',因爲它對於任何非平凡的GUI來說都太原始了,所以我沒有意識到你正在描述它的默認行爲。 – 2010-10-07 04:21:16

回答

4

你需要做包含面板實施Scrollable,和s根據寬度調整首選的可滾動視區大小。

import java.awt.*; 
import javax.swing.*; 

public class Test 
{ 
    public static void main(String args[]) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JPanel container = new ScrollablePanel(); 
       container.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
       for(int i = 0; i < 20; ++i) 
       { 
        JPanel p = new JPanel(); 
        p.setBorder(BorderFactory.createLineBorder(Color.RED)); 
        p.setPreferredSize(new Dimension(50, 50)); 
        p.add(new JLabel("" + i)); 
        container.add(p); 
       } 

       JScrollPane scroll = new JScrollPane(container); 
       scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
       scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

       JFrame f = new JFrame("Test"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
       f.getContentPane().add(scroll);      
       f.pack(); 
       f.setSize(250, 300); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

class ScrollablePanel extends JPanel implements Scrollable 
{ 
    public Dimension getPreferredSize() 
    { 
     return getPreferredScrollableViewportSize(); 
    } 

    public Dimension getPreferredScrollableViewportSize() 
    { 
     if(getParent() == null) 
      return getSize(); 
     Dimension d = getParent().getSize(); 
     int c = (int)Math.floor((d.width - getInsets().left - getInsets().right)/50.0); 
     if(c == 0) 
      return d; 
     int r = 20/c; 
     if(r * c < 20) 
      ++r; 
     return new Dimension(c * 50, r * 50); 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) 
    { 
     return 50; 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) 
    { 
     return 10; 
    } 

    public boolean getScrollableTracksViewportHeight() 
    { 
     return false; 
    } 

    public boolean getScrollableTracksViewportWidth() 
    { 
     return getParent() != null ? getParent().getSize().width > getPreferredSize().width : true; 
    } 
} 

爲簡單起見,所有數字都是硬編碼的,但您應該明白。

+0

WOW,永遠帶着我,無論我做了什麼,getPreferredScrollableViewportSize()都不會被調用,只調用了getPreferredSize(),所以我從頭開始,然後工作,沮喪地比較了兩個代碼,顯然NetBeans在某些情況下會生成setPreferredSize(w,h),並且一旦設置了此視口布局,將跳過該方法。善於騎行,這是一個bug手。腳。感謝您的幫助,我想我得到了我需要的一切。 – TacB0sS 2010-10-08 04:10:04

+1

爲什麼我不使用GUI構建器:) – 2010-10-08 13:44:38