2010-02-18 77 views
4

我已經寫了使用擺動Java編寫的代碼,所以我將有一個JScrollPane添加的JPanel,然後我會在垂直的方式增加固定大小的按鈕的JPanel如何獲得垂直滾動到JPanel?

JPanel panel=new JPanel(); 
    panel.setBackground(Color.WHITE); 

    int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; 
    int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
    JScrollPane jsp=new JScrollPane(panel,v,h); 
    jsp.setPreferredSize(new Dimension(600,600)); 
    jsp.setBounds(150,670,850,200); 
    frame.add(jsp); 

然後我添加按鈕,將其在運行時。

 for(i=0;i<n;i++) 
    { 
     button[i]=new JButton(); 
     button[i].setBounds(20,y,120,120); 
     button[i].setSize(120,120); 
     button[i].setToolTipText(file[i].toString());  
     button[i].setIcon(Icon); 
     panel.add(button[i]); 
     y=y+140; 
    } 

我想添加一個按鈕一個低於其他... ...(即我想要一個垂直滾動條)

即Button1的

button2 

    ' 

    ' 

,但上面的代碼是給我的按鈕在行(即我越來越水平滾動條) ie button1 button2 ...

另一個問題是按鈕的大小。使用btn.setSize()不會影響大小...

任何人都可以幫助我嗎?

回答

7

必須使用適當的佈局管理器類似網格佈局,BoxLayout的或GridBagLayout的爲面板。
這取決於你想要在面板中放置什麼。

網格佈局更容易IMO使用:

JPanel panel = new JPanel(); 
panel.setLayout(new GridLayout(0, 1)); // any number of rows, 1 column 
... 
    panel.add(button[i]); 

BoxLayout的是幾乎一樣簡單:

JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
... 
    panel.add(button[i]); 

GridBagLayout的是更強大,允許多個列,跨越一個以上的電池組件。 ..需要GridBagConstraints添加元素:

JPanel panel = new JPanel(); 
panel.setLayout(new GridBagLayout()); 
GridBagConstraints constraints = new GridBagConstraints(
    0, RELATIVE, // x = 0, y = below previous element 
    1, 1,   // cell width = 1, cell height = 1 
    0.0, 0.0  // how to distribute space: weightx = 0.0, weighty = 0,0 
    GridBagConstraints.CENTER, // anchor 
    GridBagConstraints.BOTH, // fill 
    new Insets(0, 0, 0, 0),  // cell insets 
    0, 0);   // internal padding 
... 
    panel.add(button[i], constraints); 

看看t他的教程:Laying Out Components Within a Container(視覺指南是一個很好的起點)

編輯
你也可以通過手工鋪陳組件,即,在容器中指定每個組件的位置和大小。爲此,您必須將LayoutManager設置爲null,以便刪除默認管理器。

JPanel panel = new JPanel(); 
panel.setLayout(null); 
... 
    button[i].setLocation(x, y); 
    button[i].setSize(width, heigth); 
    // OR button[i].setBounds(x, y, width, height); 
    panel.add(button[i]); 
1

您必須爲JPanel設置LayoutManager或使用Box(BoxLayout.Y_AXIS)。

3

您需要爲您的JPanel定義合適的LayoutManager,該JPanel負責如何將Component添加到其中。默認的LayoutManagerFlowLayout,它從左到右依次排列了Component。縱向排列Component s應考慮使用BoxLayoutGridBagLayout

1

對於按鈕的大小,使用preferredSize

爲了您的佈局問題,你需要將佈局管理器更改爲一個沒有垂直佈局。爲了娛樂的目的,你可以使用BoxLayout的是這樣的:

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
1

如果您讓layout manager完成工作,這將容易得多。

在Swing中,組件佈置在其他組件(例如面板)上的方式是使用佈局管理器。

它用於避免在每次容器組件調整大小或添加新組件時必須計算所有組件的座標。

有不同的佈局管理器,這裏你需要的是BoxLayout

通過使用此佈局,您不需要指定按鈕的位置,也不需要指定其大小。佈局管理器查詢每個組件並使用該信息將它們放置在正確的位置和大小。

例如,下面的框

alt text http://img691.imageshack.us/img691/4016/samplepl.png

創建此代碼(修改後的您的版本):

import javax.swing.*; 
import java.awt.*; 
public class ScrollTest { 

    private JPanel panel; 
    private Icon[] icons = new Icon[3]; 


    public void main() { 
     panel =new JPanel(); 

     // Use top to bottom layout in a column 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 


     panel.setBackground(Color.WHITE); 

     int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; 
     int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
     JScrollPane jsp=new JScrollPane(panel,v,h); 
     jsp.setPreferredSize(new Dimension(600,600)); 
     jsp.setBounds(150,670,850,200); 
     JFrame frame = new JFrame(); 
     frame.add(jsp); 

     // my addition to load sample icons 
     loadImages(); 
     // simulate dynamic buttons 
     addButtons(); 

     frame.pack(); 
     frame.setVisible(true); 

    } 
    void loadImages() { 
     icons[0] = new ImageIcon("a.png"); 
     icons[1] = new ImageIcon("b.png"); 
     icons[2] = new ImageIcon("c.png"); 
    } 

    void addButtons() { 
     for(int i = 0 ; i < icons.length ; i++) { 
      JButton button = new JButton(); 
      Icon icon = icons[i]; 
      button.setIcon(icon); 
      // Set the button size to be the same as the icon size 
      // The preferred size is used by the layout manager 
      // to know what the component "better" size is. 
      button.setPreferredSize(new Dimension(icon.getIconWidth(), 
                icon.getIconHeight())); 
      // This is IMPORTANT. The maximum size is used bythe layout manager 
      // to know "how big" could this component be. 
      button.setMaximumSize(button.getPreferredSize()); 
      panel.add(button); 
     } 
} 
public static void main(String ... args) { 
    new ScrollTest().main(); 
} 

}

我希望這有助於。

0

也可以通過SpringLayout得到垂直滾動JPanel。如果通過設置約束SpringLayout.SOUTH來定義面板的垂直尺寸,則可能。這是可以做到這樣的:

JPanel panel = new JPanel(); 
SpringLayout panelLayout = new SpringLayout(); 
panel.setLayout(panelLayout); 

// Adding components to the panel here 
// ..... 

// That's what defines panel's exact size and makes its scrolling possible 
panelLayout.putConstraint(SpringLayout.SOUTH, panel, 0, 
     SpringLayout.SOUTH, lastComponentOfThePanel); 

JScrollPane panelScrollPane = new JScrollPane(panel); 

其中lastComponentOfThePanel是在面板的底部的部件。

希望這會幫助別人。在我看來,SpringLayout是非常強大的佈局管理器,有時用GridBagLayout替換這個很難或幾乎不可能。

0

那麼呢?

JScrollPane scrollPane = new JScrollPane(yourpanel); 
container.add(scrollPane);