JFrame使用null布局非常小

Xpe*_*z X 1 java swing jpanel 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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Aza*_*zad 5

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

只需删除此行:

pane.setLayout(null);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • *"我无法在面板上设置其位置"*您**不应该**设置组件的位置. (3认同)
  • *"为什么不呢?"*由于我在7分钟前发表评论的原因.*"布局管理器有点复杂,不是吗?"*比自己确定组件定位要简单得多(**同样**原因). (2认同)

Ani*_*kur 5

如果你看到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();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都归结为layoutMgr.preferredLayoutSize(this); 自从你没有设置布局(或null),你就会遇到这个问题.删除该语句或使用一些布局.