outerPanel.add(scrollPane, BorderLayout.CENTER);
BoxLayout 没有约束,因此不需要 BorderLayout.CENTER。
问题是 BoxLayout 尊重组件的最大尺寸,对于滚动窗格来说,该尺寸设置得非常大。
不要使用 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() 方法,只返回首选大小。
请注意,在测试这两种解决方案时,请确保您使窗口小于滚动窗格,以查看每种布局的工作方式有何不同。