【问题标题】:JPanel inside JScrollPane expanding on packJScrollPane 内的 JPanel 在包上扩展
【发布时间】:2014-03-12 15:50:54
【问题描述】:

我在 JScrollPane 内有一个 JPanel,它嵌套在其他一些容器中。我的 JPanel 在 this question 中使用来自 SO 用户 jxd 的修改后的 FlowLayout。

这可能是信息过度杀伤,但相关面板的完整嵌套如下:

JPanel (ModifiedFlowLayout) > JScrollPane > JPanel (GridBagLayout) > JTabbedPane > JPanel (GridBagLayout) > JSplitPane > JPanel (BorderLayout) > JFrame。

问题是,当我在 JFrame 上调用 pack() 时,JScrollPane/JPanel 会水平扩展以填充整个剩余的屏幕空间(跨多个监视器)。使用的空间超过了显示 JPanel 中所有组件所需的空间。我尝试在我的 JPanel 上使用 setMaximumSize(),但在这种情况下它似乎被忽略了。

理想情况下,我希望面板的大小由围绕它的组件调整大小后剩余的空间决定。可以/如何做到这一点?

【问题讨论】:

  • 你尝试过覆盖getPreferredSize()吗?
  • @nachokk 好吧,我会被诅咒的。我认为最大尺寸将是比首选尺寸更重要的因素,但设置似乎阻止了扩展,尽管它导致 ModifiedFlowLayout 开始表现不正确,但这可能是一个不同的问题。我也没有覆盖它,因为我只使用了 JPanel 没有扩展它。我改用setPreferedSize()
  • @nachokk 有趣的发现现在面板仍然很大(考虑到我使用了HORIZONTAL_SCROLLBAR_NEVER,这并不容易看到)并且大部分是空的,但打包时它不会扩展整个框架。

标签: java swing jscrollpane


【解决方案1】:

FlowLayout 的首选大小将尝试在单行上显示所有组件。我不知道 ModifiedFlowLayout 是如何工作的,但您可以查看 Wrap Layout,它的作用相同。

但是,当使用Wrap Layout 时,您可以使用 setSize(...) 方法来建议初始宽度应该是多少。组件的初始包装应基于该尺寸。

【讨论】:

  • 我试过了,看起来 WrapLayout 和 ModifiedFlowLayout 有相同的行为。 @nachokk 使用首选尺寸而不是最大尺寸的评论结果证明是手头问题的解决方案,但他没有将其发布为答案,因此我无法标记它。
  • @Fr33dan,你不应该使用 setPreferredSize()。如果用户调整框架的大小,布局不会动态改变。
  • 如果我在我的 JPanel 上使用 setPreferredSize() 是正确的,如果我直接对我的 JScrollPane 执行它,它会按需要工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2011-04-18
  • 2023-03-07
相关资源
最近更新 更多