我在一个布局中有几个 JPanel,每当我用鼠标手动更改 JFrame 的大小时,它都会拉伸 JPanel 并使其看起来很乱。有没有办法禁用它?
3 回答
用户无法调整 JPanel 的大小。
如果您指的是 JFrame,则可以使用
yourFrame.setResizable(false);
这都是关于您正在使用的 LayoutManager 的。一些 LayoutManagers 像 BorderLayout 总是给添加在中心位置的孩子额外的空间。然而,北、南、东和西只为它们分配了首选大小。我最喜欢的 LayoutManager 是 TableLayout,它非常易于使用,而且非常强大。您可以选择如何为每个孩子分配额外空间。所以这真的取决于你使用的是什么。
您还可以在 JFrame 上设置MaximumSize,它不允许您调整 JFrame 的大小。
我想扩展@Shehzad 和@chubbsondubs 给出的答案。
首先,正如 Shehzad 所说,“可调整大小”不是JPanel
对象的已知属性。然而,它是包含面板(和其他组件)的窗口或框架的属性。现在的问题是如何防止面板在调整其容器大小时调整其大小。正如chubbsondubs 所说,这完全取决于您正在使用的布局管理器。考虑以下代码片段:
add(contextPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
add(sidebar, BorderLayout.WEST);
这些行是从框架的构造函数中提取的。该sidebar
对象是一个面板,GridBagLayout
用于在其中放置文本字段、标签和其他组件。即使我已将面板的 、 和 属性设置preferredSize
为minimumSize
相同maximumSize
的尺寸,但当我调整对话框大小时,容器不会“尊重”sidebar
对象中设置的最小、最大和首选尺寸属性(Research Layout Managers to知道为什么会这样)。因为我的对话框(框架)不遵守这些大小限制,所以我必须将其sidebar
与父框架隔离。为此,只需将其添加sidebar
到另一个面板,然后将此新面板添加到对话框中。换句话说,“侧边栏”是通过添加其直接父级间接添加到对话框中的。
JPanel dummyPane = new JPanel();
dummyPane.add(sidePanel);
add(contextPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
add(dummyPane, BorderLayout.WEST);
现在,在这种情况下,dummyPane
“尊重”sidebar
对象中定义的大小约束,同时由父框架调整大小。
更新:
最后一件事...如果您使用的是Absolute Positioning,则必须设置size
属性而不是preferredSize
、minimumSize
或maximumSize
。使用绝对定位时会忽略这些。绝对定位是当布局管理器设置为null
并且组件的x、y坐标被显式设置时。size
可以使用setSize(int width, int height)
或方法设置组件的setBounds(int x, int y, int width, int height)
。