outerPanel.add(scrollPane, BorderLayout.CENTER);
BoxLayout не принимает ограничений, поэтому BorderLayout.CENTER ненужно.
Проблема заключается в том, что BoxLayout учитывает максимальный размер компонента, который для scrollpane устанавливается очень большим.
Вместо использования BoxLayout просто используйте панель с FlowLayout.
Запустите пример ниже, чтобы узнать, что вы сейчас делаете. Затем закомментируйте инструкцию setLayout (...) и запустите снова. По умолчанию панель использует FlowLayout, поэтому вы получите то, что хотите.
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane(textArea);
//scrollPane.setMaximumSize(scrollPane.getPreferredSize());
add(scrollPane);
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Или, если вы действительно хотите сохранить BoxLayout затем оставить держать setLayout (...) заявление, а затем установить максимальный размер, равный размеру преимущественного. Многие люди скажут, что вы никогда не должны ссылаться на метод setXXX(), и вместо этого вы должны переопределить метод setMaximumSize() scrollpane, чтобы просто вернуть предпочтительный размер.
Обратите внимание, что при тестировании этих двух решений убедитесь, что окно меньше размера прокрутки, чтобы увидеть, как каждый макет работает по-разному.
+1 для напоминания 'pack()! –