使用null布局的JFrame非常小

嗨,我正在编写一个简单的程序来显示一个框架。 然而,当我输入setLayout(null)时,框架变得非常小; 但如果我忽略这个命令,按钮总是在顶部中心可以有人指出我的错误吗?

import java.io.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; class theframe { private static void create() { JFrame frame = new JFrame("FrameDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Insets insets = frame.getInsets(); frame.setSize(500 + insets.left + insets.right, 350 + insets.top + insets.bottom); add(frame.getContentPane()); //my function add frame.pack(); frame.setVisible(true); } public static void add(Container pane) { pane.setLayout(null); Insets insets = pane.getInsets(); JPanel p1 = new JPanel(); p1.setPreferredSize(new Dimension(500, 350)); JButton b1 = new JButton("one"); Dimension size = b1.getPreferredSize(); b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height); pane.add(p1); p1.add(b1); } public static void main(String Args[]) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { create(); } }); } } 

如果你看到pack()函数,它不在JFrame.java中,而是在Window.java中

 public void pack() { Container parent = this.parent; if (parent != null && parent.getPeer() == null) { parent.addNotify(); } if (peer == null) { addNotify(); } Dimension newSize = getPreferredSize(); if (peer != null) { setClientSize(newSize.width, newSize.height); } if(beforeFirstShow) { isPacked = true; } validateUnconditionally(); } 

现在,如果你在Container.java中看到getPreferredSize()函数

 @Deprecated public Dimension preferredSize() { /* Avoid grabbing the lock if a reasonable cached size value * is available. */ Dimension dim = prefSize; if (dim == null || !(isPreferredSizeSet() || isValid())) { synchronized (getTreeLock()) { prefSize = (layoutMgr != null) ? layoutMgr.preferredLayoutSize(this) : super.preferredSize(); dim = prefSize; } } if (dim != null){ return new Dimension(dim); } else{ return dim; } } 

一切都归结为layoutMgr.preferredLayoutSize(this); 由于您没有设置布局(或null),因此您遇到了这个问题。 删除该语句或使用一些布局。

您正在使用绝对定位( null布局)调用pack()方法,您应该使用LayoutManager而不是使用将布局设置为null

只需删除此行:

 pane.setLayout(null); 

注意:接受我的建议并自己学习LayoutManagers ,因为如果你拒绝学习,你可能会去null布局,是的,它更容易,但强烈建议不要使用它。

你必须知道一些基本的事情:

  1. JFrame的默认布局是BorderLayout ,只有五个位置可以放置组件,如链接所示。
  2. FlowLayout是每个JPanel的默认布局管理器。 它只是将组件放在一行中,如果它的容器不够宽,则开始一个新行。

毕竟,在开始使用swing之前,请阅读有关LayoutManagers的更多信息,相信我它会使您的工作变得更加轻松,只需尝试一下,这太棒了。

Java GUI可能必须在许多平台上,在不同的屏幕分辨率和使用不同的PLAF上工作。 因此,它们不利于组件的精确放置。

要组织强大的GUI组件,请使用布局管理器或它们的组合,以及布局填充和白色空间边框。

有关如何:

  1. 结合布局。
  2. 使用布局构造函数参数和边框提供空白。

幸运的是我有同样的问题,我用一行代码解决了。 愿这也有助于您尝试按照以下步骤操作:

1-转到您的文件代码中

2-在代码的开头找到这一行:

  initComponents(); 

3-只需在此行后添加此新代码:

 this.setMinimumSize(new Dimension(300, 300)); 

关键字“this”在此表示您当前的顶级组件,因此此处应用新尺寸为(300,300)。 您可以根据所需的框架/组件大小更改此300值。