首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用null布局的JFrame非常小

使用null布局的JFrame非常小
EN

Stack Overflow用户
提问于 2013-07-25 20:49:11
回答 4查看 2.4K关注 0票数 1

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

代码语言:javascript
复制
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();
            }
        });
    }
}
EN

回答 4

Stack Overflow用户

发布于 2013-07-25 20:56:36

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

只需删除这一行:

代码语言:javascript
复制
pane.setLayout(null);

备注:听从我的建议,自学LayoutManagers,因为如果你拒绝学习,你可能会去null layout,是的,它更容易,但强烈建议你不要使用它。

以下是你必须知道的一些基本情况:

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

毕竟,在开始使用swing之前先阅读更多关于LayoutManagers的知识,相信我,它会让你的工作变得非常容易,试一试,它是令人惊叹的。

票数 5
EN

Stack Overflow用户

发布于 2013-07-25 21:01:00

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

代码语言:javascript
复制
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()函数

代码语言:javascript
复制
@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),你就会遇到这个问题。要么删除该语句,要么使用某种布局。

票数 5
EN

Stack Overflow用户

发布于 2013-07-25 21:09:14

Java GUI可能需要在不同的平台上工作,使用不同的屏幕分辨率&使用不同的平台。因此,它们不利于零部件的精确放置。

要组织组件以实现健壮的GUI,请改用布局管理器或它们的组合,以及布局填充和空白边框。

有关如何执行以下操作的提示,请参阅this answer

使用布局构造函数参数和边框组合layouts.

  • Provide空白。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17858500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档