1

嗨,我正在编写一个简单的程序来显示一个框架。但是,当我键入 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();
            }
        });
    }
}
4

4 回答 4

5

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

只需删除此行:

pane.setLayout(null);

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

你必须知道的一些基本知识:

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

毕竟,在开始使用 swing 之前,请阅读更多关于LayoutManagers的信息,相信我,它让您的工作变得更加轻松,试试吧,这太棒了。

于 2013-07-25T12:56:35.657 回答
5

If you see the pack() function it is not in JFrame.java but 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();
}

now if you see getPreferredSize() function in Container.java

@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;
    }
}

Everything boils down to layoutMgr.preferredLayoutSize(this); Since you are not setting the layout(or null) you are getting that issue. Either remove that statement or use some layout.

于 2013-07-25T13:01:00.213 回答
2

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

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

有关如何执行以下操作的提示,请参阅此答案:

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

于 2013-07-25T13:09:14.400 回答
1

幸运的是,我遇到了同样的问题,我用一行代码解决了。这也将帮助您尝试遵循以下步骤:

1-转到您的文件代码

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

            initComponents();

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

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

此处的关键字“this”代表您当前的顶级组件,因此此处应用了 (300, 300) 等新维度。您可以根据所需的框架/组件尺寸更改这 300 个值。

于 2017-08-11T20:35:52.140 回答