java - JFrame 非常小,使用空布局

标签 java swing jframe jpanel

您好,我正在编写一个简单的程序来显示框架。 但是,当我键入 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),因此您遇到了这个问题。删除该语句或使用一些布局。

关于java - JFrame 非常小,使用空布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17858500/

相关文章:

java - Neo4j + Postgres 共同事务

java - Selenium Web Driver 无限测试

java - JOptionPane 或更好的解决方案

java - 将 JList 保存到 Txt 文件中

java - 检查(多个 Jbutton 中的)哪个 Jbutton 被单击

Java Swing GUI,根据单击的按钮更改显示。实现这一点的理想方法是什么?

java - 如何在 AJAX 更新时更新行样式?

java - 声明要在数组中使用的枚举?

java - 图标左对齐的 JLabel

java - 如何使用 iText Java 制作多页 PDF