В моем проекте мне удалось использовать GridLayout, и результаты очень стабильны, без мерцания и с прекрасно работающей вертикальной полосой прокрутки.
Сначала я создал JPanel для настроек; в моем случае это сетка со строкой для каждого параметра и двумя столбцами: левый столбец - для меток, а правый столбец - для компонентов. Я считаю, что ваш случай похож.
JPanel yourSettingsPanel = new JPanel();
yourSettingsPanel.setLayout(new GridLayout(numberOfParams, 2));
Затем я заполняю эту панель, перебирая свои параметры и переключаясь между добавлением JLabel и добавлением компонента.
for (int i = 0; i < numberOfParams; ++i) {
yourSettingsPanel.add(labels[i]);
yourSettingsPanel.add(components[i]);
}
Чтобы предотвратить распространение вашей панели настроек на весь контейнер, я сначала обертываю ее в северной области фиктивной панели, которую я назвал northOnlyPanel.
JPanel northOnlyPanel = new JPanel();
northOnlyPanel.setLayout(new BorderLayout());
northOnlyPanel.add(yourSettingsPanel, BorderLayout.NORTH);
Наконец, я обертываю northOnlyPanel в JScrollPane, которая должна вести себя практически везде.
JScrollPane scroll = new JScrollPane(northOnlyPanel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
Скорее всего, вы хотите отобразить эту JScrollPane, расширенную внутри JFrame; Вы можете добавить его в JFrame BorderLayout в регионе CENTER:
window.add(scroll, BorderLayout.CENTER);
В моем случае я помещаю его в левый столбец панели GridLayout (1, 2) и использую правый столбец для отображения контекстной справки для каждого параметра.
JTextArea help = new JTextArea();
help.setLineWrap(true);
help.setWrapStyleWord(true);
help.setEditable(false);
JPanel split = new JPanel();
split.setLayout(new GridLayout(1, 2));
split.add(scroll);
split.add(help);