我有一个cardlayout JPanel,里面是一个JScrollPane,里面是一个springlayout JPanel。 springlayout JPanel正在从上到下动态添加JPanels,但是当JButton超出JPanel时,JScrollPane不适应额外的内容。此外,尽管添加了内容,但JPanel的弹簧高度显然仍为0。设置resizable属性为true也没有。
这是一个代码片段。我省略了cardlayout 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 :(得分:0)
我自己遇到了一些问题。对我有用的是使用borderlayout。并且您需要在添加新元素后调用revalidate以更新滚动面板。
以下是我在项目中使用的代码示例:
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中删除元素,否则它们将一直显示,直到您绘制它们为止。