在没有布局管理器的情况下将JScrollPane添加到JPanel

在开始之前,我知道不使用布局管理器是个坏主意,通常我会使用布局管理器,但是,我也会根据窗口的大小自动重新resize并重新定位。 此外,我正在开发的程序仅用于在整个生命周期内在一台机器上运行。 请不要因为缺少布局管理器而向我投票,我发现它是我需要的特定程序。

对于我的问题,我在stackoverflow上发现了类似的post,但从未实现过解决方案。 我正在向我的JPanel添加动态数量的JLabels ,我注意到当不使用布局管理器时,滚动条不起作用。

这是我的初始化代码的简化版本。

 JPanel mypanel = new JPanel(); mypanel.setLayout(null); mypanel.setSize(800,450); mypanel.setForeground(Color.WHITE); mypanel.setBackground(Color.BLACK); scrollablePanel = new JScrollPane(mypanel); scrollablePanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollablePanel.setPreferredSize(new Dimension(800,300)); scrollablePanel.setSize(800,300); scrollablePanel.setLocation(250,156); myContainer.add(scrollablePanel); 

myContainer将成为容器(也没有布局管理器)。 稍后将JLabels添加到JPanel中:

enter code here mypanel.add(label1);

setForegroundsetBackground等标签设置了一些基本设置后。

不幸的是,在运行时,滚动条看起来好像不需要(见图)

http://sofzh.miximages.com/java/zp0QKGG.png

图像中显示的表格文本由多个JLabels 。 如果在不使用布局管理器的情况下无法解决问题,我将切换到BoxLayout,我只是希望有一个解决方案。

问题是JScrollPanel需要视图组件的首选大小来确定视图何时超出滚动窗格的可视区域。

组件的首选大小通常通过布局管理器确定。 虽然您可以使用setPreferredSize ,但通常不鼓励使用它,您只会遇到同样的问题,因为内容超出了您决定设置的值。

更好的解决方案是使用LayoutManager或复合布局(在多个容器上使用多个布局管理器)来实现您想要的结果……或者编写您自己的…