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

Java 在没有布局管理器的情况下将JScrollPane添加到JPanel,java,swing,jpanel,jscrollpane,null-layout-manager,Java,Swing,Jpanel,Jscrollpane,Null Layout Manager,在开始之前,我意识到不使用布局管理器是个坏主意,通常我会使用布局管理器,但是,我也会根据窗口的大小自动重新调整所有组件的大小和位置。此外,我正在使用的程序在其整个生命周期内仅在一台机器上运行。请不要仅仅因为缺少布局管理器就否决我,我发现这正是我这个特殊项目所需要的 对于我的问题,我在stackoverflow上找到了类似的帖子,但没有找到解决方案。 我在我的JPanel中添加了大量动态的JLabels,我注意到当不使用布局管理器时,滚动条不起作用 这是我的初始化代码的简化版本 JPanel my

在开始之前,我意识到不使用布局管理器是个坏主意,通常我会使用布局管理器,但是,我也会根据窗口的大小自动重新调整所有组件的大小和位置。此外,我正在使用的程序在其整个生命周期内仅在一台机器上运行。请不要仅仅因为缺少布局管理器就否决我,我发现这正是我这个特殊项目所需要的

对于我的问题,我在stackoverflow上找到了类似的帖子,但没有找到解决方案。 我在我的
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
将是容器(也没有布局管理器)。
jlabel
稍后添加到
JPanel
,其中包括:

在此处输入代码
mypanel.add(标签1)

在为标签设置一些基本设置后,例如
setForeground
setBackground

不幸的是,当运行时,滚动条似乎不是必需的(参见图)

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

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

组件的首选尺寸通常通过布局管理器确定。虽然您可以使用
setPreferredSize
,但通常不鼓励使用,并且当内容超过您决定设置的值时,您将遇到相同的问题


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

JScrollPane
依赖于视图的
getPreferredSize
方法的结果,它依赖于
LayoutManager
…因此无法使其工作,或者是否可以手动设置PreferedSize?@alex2410但它永远不会显示滚动条洗涤器…简短的回答不是真的。说真的,一个更简单的解决方案是使用一个或三个合适的布局管理器,甚至只使用一个
JTable
…啊,我明白了,
myPanel.setPreferredSize(新尺寸(800450))
似乎可以工作,但我知道问题稍后会出现在哪里。谢谢你的帮助。如果你愿意,你可以写下正式的答案,我会选择它作为任何遇到类似情况的人的正确答案。