我正在尝试将最小尺寸设置的新面板插入到现有表单中。不幸的是,在我这样做之后:
this.add(scrap);
this.moveScrapCentre(scrap); // runs setLocation(...)
this.revalidate();
this.repaint();
(其中this
:JPanel为null布局,scrap
:JPanel包含框布局和子项)
scrap
调整为(0,0)
- 即使我在Netbeans的属性编辑器中设置了最小和首选大小。除了强制scrap.setSize(scrap.getPreferredSize())
之外,我该如何防止这种情况?
答案 0 :(得分:1)
“虽然我们强烈建议您使用布局管理器,但您可以在没有它们的情况下执行布局。通过将容器的布局属性设置为null,可以使容器不使用布局管理器。使用此策略称为绝对定位,您必须指定该容器中每个组件的大小和位置。绝对定位的一个缺点是,当调整顶层容器的大小时它不能很好地调整。它也不能很好地适应用户和系统之间的差异,例如不同的字体大小和语言环境。“ - Setting the Layout Manager
附录:糟糕,我误解了这个问题。只是做
this.setPreferredSize(new Dimension(w, h));
使用您想要的w
和h
值。如果this
是间隔符,则布局无关紧要。
附录:仔细观察,scrap
的大小可能会动态变化。您可以相应地覆盖getPreferredSize()
。当您使用GUI设计器时,您的面板会声明如下:
public class NewJPanel extends javax.swing.JPanel
您可以在类中添加所需的方法,但在生成的代码之外:
@Override
public Dimension getPreferredSize() {
return new Dimension(w, h);
}
除此之外:GUI设计器是一个 aid ,它假定您对底层布局管理器有所了解。注意要求您将它用于每个面板,并且许多布局都相当straightforward。我经常看到设计师的用途是为需要更复杂布局的面板保留,例如GroupLayout
和SpringLayout
。