最终使用滚动条的JPanel列表

我试图为我的Java应用程序构建一个GUI。 我动态添加JPanels,这是我GUI中的“行”。 在面板列表下面有一个添加新面板的按钮。 随着List的增长,它到达父Container的末尾。 然后我想使用滚动条,以便用户能够到达列表中的每个面板。

到目前为止,我尝试了JScrollPanes和Layouts,但我不知道如何让它工作。

你能给我一些建议吗?

this.setLayout(new BorderLayout()); JPanel listContainer = new JPanel(); listContainer.setLayout(BoxLayout(listContainer, BoxLayout.Y_AXIS); this.add(new JScrollPane(listContainer), BorderLayout.CENTER); this.add(new JButton(), BorderLayout.PAGE_END); //then i add panels to the listContainer. this wont work, when the space is complettly used there is no scrollbar. 

从您的代码片段中确切地确定您可能遇到问题的位置很难确定。

在此处输入图像描述

 public class DynamicPanelList { public static void main(String[] args) { new DynamicPanelList(); } public DynamicPanelList() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JPanel mainList; public TestPane() { setLayout(new BorderLayout()); mainList = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 1; gbc.weighty = 1; mainList.add(new JPanel(), gbc); add(new JScrollPane(mainList)); JButton add = new JButton("Add"); add.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JPanel panel = new JPanel(); panel.add(new JLabel("Hello")); panel.setBorder(new MatteBorder(0, 0, 1, 0, Color.GRAY)); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; mainList.add(panel, gbc, 0); validate(); repaint(); } }); add(add, BorderLayout.SOUTH); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } } 

您确实需要提供一个SSCCE ,以便我们诊断您遇到的问题。

就个人而言,这将取决于您的要求,更好的布局管理器可能是来自SwingLabs SwingX库的VerticalLayout

您可能忘记在listContainer上调用revalidate() (并且您犯了一堆语法错误)。 BoxLayout在我看来并不是很出色,但这不是问题所在。

这是一个小的演示代码,似乎运行得很好:

 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestScollpane { private int i; private JPanel listContainer; private void initUI() { final JFrame frame = new JFrame(TestScollpane.class.getSimpleName()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); listContainer = new JPanel(); listContainer.setLayout(new BoxLayout(listContainer, BoxLayout.Y_AXIS)); frame.add(new JScrollPane(listContainer), BorderLayout.CENTER); JButton button = new JButton("Add"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final JPanel newPanel = new JPanel(); newPanel.add(new JLabel("Label " + i++)); listContainer.add(newPanel); listContainer.revalidate(); // Scroll down to last added panel SwingUtilities.invokeLater(new Runnable() { @Override public void run() { newPanel.scrollRectToVisible(newPanel.getBounds()); } }); } }); frame.add(button, BorderLayout.PAGE_END); frame.setSize(300, 200); frame.setVisible(true); } public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { // TODO Auto-generated catch block e.printStackTrace(); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TestScollpane().initUI(); } }); } }