Так я и поступил сначала.
public class MyFrame extends JFrame {
public MyFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(500 ,300));
setResizable(false);
pack();
setLocationRelativeTo(null);
initComponents();
}
private void initComponents() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
for (int i=0; i < 100; i++)
panel.add(new JLabel("some text"));
JScrollPane scrollPane = new JScrollPane(panel,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// Here I create a JPanel to replace the contentPane of JFrame
JPanel contentPane = new JPanel();
contentPane.add(scrollPane);
setContentPane(contentPane);
}
Если вместо этого я заменю последние 3 строки на это:
getContentPane().add(scrollPane);
все хорошо. Но, как и раньше, вертикальная полоса прокрутки не отображается. Чем это вызвано? Неправильно ли установить JPanel как contentPane?
Обновление: если contentPane меняется на BorderLayout, все работает нормально.
// Here I create a JPanel to replace the contentPane of JFrame
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(scrollPane);
setContentPane(contentPane);
Итак, проблема в FlowLayout по умолчанию?
Решено: проблема в FlowLayout. Он оборачивается вокруг JScrollPane и скрывает панели инструментов. с использованием
scrollPane.setPreferredSize(new Dimension(500, 400)); // longer space in x-axis
решает это.
Ответ: JSrollPane не следует использовать внутри контейнера, который использует FlowLayout.
pack()
следует вызывать после добавления всех компонентов, особенно после вызоваinitComponents()
. Чтобы быстрее получить более качественную помощь, опубликуйте MCVE (минимальный полный и проверяемый пример). - person Andrew Thompson   schedule 11.07.2014