自动调整Swing元素的大小以适应容器的尺寸

14

不确定我需要的是否可行。 我有一个容器(JPanel),其中包含一些内部元素。 我想知道是否可以强制使内部元素适应容器的大小。 我需要它们完全可见,即调整大小以适合面板的大小,而不是裁剪一些内部元素的部分。

滚动不是选项。

通过使用布局或其他方式可以实现吗?

编辑:重要澄清: 问题在于我无法访问内部元素,也无法访问其属性,因此我会说需要一种能够调整子元素大小以适应其大小的布局管理器。我尝试过边框布局(BorderLayout)和网格袋布局(GridBagLayout),但结果总是相同的,内部元素被裁剪掉了。


2
“LayoutManager”是显而易见的解决方案。如果您明确说明您希望如何显示组件,也许有人会建议您更喜欢的“LayoutManager”。 - Mohayemin
1
“显而易见”的答案是扩展组件(例如JTree),将它们添加到没有JScrollPane的布局中,在框架上调用pack(),然后调用frame.setMinimumSize(frame.getSize());。工作完成。 - Andrew Thompson
听起来很奇怪,你无法访问“内部元素”的属性,这些元素是 JComponent 对吧?那么,你可以访问 JComponent 的任何标准属性,特别是大小。 - jfpoilpret
5个回答

14
正因为如此,布局管理器 才存在。所有的 LayoutManagers都可以直接用于简单容器,但 GridBagLayout 可以直接处理大多数完整的GUI。
对于大多数完整的GUI,您有以下几个选择:
  • 查找 第三方布局 ,例如MigLayout这里
  • 使用GridBagLayout
  • 最简单的方法是使用嵌套布局,其中有多个 JPanel,每个面板都有子 JPanel,其具有相同或不同的 LayoutManager
  • 或者自定义布局,可能会更加困难...,但与使用 GridBagLayout 相同

2
如果自定义布局与GBL相同,为什么不直接使用GBL呢?;) 感谢提供链接和选项。 - Andrew Thompson

6
您可以将JPanel布局设置为BorderLayout,然后将单个子组件添加到中心。如果有多个子组件,则此方法变得不太有用,因为添加到NORTH、SOUTH、EAST和WEST的组件将保持静态大小,而中心会调整大小以填充其余空间。
简而言之,这不是一个理想的解决方案。在Swing中进行所有布局都变得更加复杂,因为不同的组件有不同的行为方式,所以您真的需要提供有关要添加到面板的子组件的进一步详细信息,以及对这些组件覆盖的任何行为。
最好的方法是尝试几个简单的示例,看看您能得到什么结果,以及微妙的重设计划是否有助于改善您的子组件嵌套。

0

我在JDesktopPane中使用了一个JInternalFrame。我希望internal_frame在桌面窗格调整大小时自动调整大小,因此我必须为内部窗格实现AncestorResized事件,并放置以下代码:

this.setPreferredSize(this.getParent().getPreferredSize());
this.pack();

作为一般建议:永远不要使用setXXSize(https://dev59.com/BGw05IYBdhLWcg3weBlF#7229519)-可以说内部框架可以被视为有点例外,因为它们相对于父级desktopPane的大小不受LayoutManagers控制。但是,问题不是关于内部框架,是吗 :-) - kleopatra

0

你可以根据情况使用布局,如GridBagLayout或BorderLayout。通过适当的权重设置,这是可能的。


0

对我来说,这听起来就像是你应该选择一个适当的布局管理器并使用它。例如,看一下BorderLayout-将您的组件放在CENTER中,它将占用所有区域。每个具体的布局管理器决定组件的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接