2016-12-23 97 views
0

我有一個cardlayout JPanel,裏面是一個JScrollPane,裏面是一個springlayout JPanel。 springlayout JPanel是從上到下動態添加JPanel,但是當JButton超越JPanel時,JScrollPane不支持額外的內容。另外,儘管添加了內容,但顯然彈簧佈局JPanel的高度仍爲0。將可調整大小的屬性設置爲true也不起作用。JScrollPane沒有響應,因爲JPanel沒有調整大小

這是一段代碼片段。我省略了卡片佈局JPanel和代碼切換卡片。

SpringLayout mainlayout = new SpringLayout(); 
    JPanel maincard = new JPanel(mainlayout); // springlayout JPanel 
    for (int i = 0; i < info.size(); i++) { 
     GridLayout entryLayout = new GridLayout(1, 1); 
     JPanel entry = new JPanel(entryLayout); 
     entry.setSize(800, 30); 

     JButton name = new JButton(); 
     name.setSize(250, 30); 
     name.setText(info.get(i).name); 

     entry.add(name); 

     mainlayout.putConstraint(SpringLayout.NORTH, entry, 
       i * 100 + 5, 
       SpringLayout.NORTH, maincard); // moves JPanel lower and lower 
     maincard.add(entry); 
    } 
    maincard.setSize(width, 30 * (info.size() + 1)); 
    maincard.revalidate(); 
    JScrollPane scroll = new JScrollPane(maincard); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    scroll.setSize(200, 200); // this and setPreferredSize don't affect 
    cardpanel.add(scroll, cardName); 
    cardpanel.setSize(20, 200); // no effect 
+0

'顯然彈簧佈局JPanel的高度依然爲0' - SpringLayout是由於所需的所有約束而使用的更復雜的佈局管理器之一。我的建議是使用另一個佈局管理器。或者如果你真的想使用SpringLayout,那麼你需要閱讀Swing教程中有關[如何使用SpringLayout]的部分(http://docs.oracle.com/javase/tutorial/uiswing/layout/spring.html )瞭解更多信息和工作示例。本教程還包含有關其他標準佈局管理器的部分。 – camickr

+0

是的,我忘了提及我也嘗試了其他佈局。預期的輸出應該是聯繫人列表,其中的條目是JPanel。我試過GridLayout,但我無法控制條目的大小。對於Box/BoxLayout,條目永遠不會超出容器(gridlayout)。 GridBagLayout有同樣的問題。邊框不存在問題(我不需要疊加),並且流程僅用於包裝的水平。 –

+0

GridLayout將不起作用,因爲組件大小適合可用空間。 BoxLayout或GridBagLayout將用於垂直添加組件。 – camickr

回答

0

我自己也有一些問題。對我來說有效的是使用borderlayout。並且您需要在添加新元素以更新滾動面板後調用重新驗證。

下面是我在我的項目中使用了一段時間後的代碼示例:

public BookingTable() 
{ 
    super(new BorderLayout()); 
    _contentPanel = new JPanel(); 
    _contentPanel.setLayout(new BoxLayout(_contentPanel, BoxLayout.Y_AXIS)); 
    _scrollPane = new JScrollPane(_contentPanel); 

    add(_scrollPane, BorderLayout.CENTER); 
} 

private void addToPanel(EntryView panel) 
{ 
    panel.setPreferredSize(new Dimension(150, 35)); 
    panel.setMaximumSize(new Dimension(160, 45)); 
    panel.setMinimumSize((new Dimension(80, 30))); 

    _contentPanel.add(panel); 
    _contentPanel.revalidate(); 
} 

希望這可以幫助你!另一個提示是,如果您從ScrollPane中刪除元素,則需要調用Repaint才能從UI中實際刪除元素,如果不這樣,它們將保持可見狀態,直到您畫出它們。

+0

方法名稱不應以大寫字符開頭。 – camickr

+0

我自己最近一直在離開它,這是我改變它的一些舊代碼。 –