【问题标题】:Adding JScrollPane to a JPanel without a Layout Manager在没有布局管理器的情况下将 JScrollPane 添加到 JPanel
【发布时间】:2017-09-09 21:46:26
【问题描述】:

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

对于我的问题,我在 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 是容器(也没有布局管理器)。 JLabels 稍后会添加到 JPanel 中:

enter code heremypanel.add(label1);

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

不幸的是,在运行时,滚动条似乎不需要(见图)

http://i.imgur.com/zp0QKGG.png

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

【问题讨论】:

  • JScrollPane 依赖于视图的getPreferredSize 方法的结果,该方法依赖于LayoutManager...
  • 所以无法让它工作,还是可以手动设置 PrefferedSize?
  • @alex2410 但它永远不会显示滚动条洗涤器...
  • 简短的回答不是真的。说真的,更简单的解决方案是使用一个或三个适当的布局管理器,甚至只使用JTable...
  • 啊,我明白了,myPanel.setPreferredSize(new Dimension(800,450)); 似乎可以工作,但我知道稍后会出现问题。谢谢你的帮助。如果你愿意,你可以写下官方答案,我会选择它作为遇到类似情况的任何人的正确答案。

标签: java swing jpanel jscrollpane null-layout-manager


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多