2016-12-23 61 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

我自己最近一直在离开它,这是我改变它的一些旧代码。 –