Не используйте пустой макет. Не используйте setBounds ().
Полосы прокрутки появятся автоматически, только если предпочтительный размер панели больше, чем размер области прокрутки.
Это работа макета в:
- установить расположение компонента
- установить размер компонента
- вычислить предпочтительный размер панели.
Итак, решение состоит в том, чтобы использовать соответствующий менеджер компоновки на вашей панели.
Так, например, вы можете использовать BoxLayout:
//panel2 = new JPanel(null);
panel2 = new JPanel();
panel2.setLayout( new BoxLayout(panel2, BoxLayout.Y_AXIS) );
А затем, когда вы добавляете компоненты в видимый frame вам нужно revalidate () панель для вызова диспетчера компоновки:
//panel2.add(new JButton("Button "+i)).setBounds(80,y,120,30);
panel2.add(new JButton("Button "+i));
panel2.revalidate();
Нет необходимости в panel1. Просто добавьте компоненты во фрейм:
//panel1.add(pane);
//panel1.add(button);
frame.add(button, BorderLayout.PAGE_START);
frame.add(pane, BorderLayout.CENTER);
Но есть и другие проблемы:
pane = new JScrollPane();
Вам действительно нужно добавить панель в область прокрутки. Таким образом, код должен быть:
pane = new JScrollPane(panel2);
Поскольку у компонента может быть только один родительский элемент, вам необходимо удалить:
pane.add(panel2);
Поскольку панель2 была добавлена в область прокрутки.
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel1);
frame.pack();
Приведенный выше лог c неверен.
Вы должны вызывать pack () и setVisible (true) только ПОСЛЕ того, как все компоненты были добавлены во фрейм.
Значит, большая часть опубликованного кода неверна.
Начните с прочтения раздела из краткого обзора Swing на Layout Managers . Загрузите рабочий демонстрационный код и узнайте, как лучше структурировать свой код. Измените код для вашего примера c.