6

Code:

import java.awt.Dimension;

import javax.swing.*;

public class Game extends JFrame {
    private static final long serialVersionUID = -7919358146481096788L;
    JPanel a = new JPanel();
    public static void main(String[] args) {
        new Game();
    }
    private Game() {
        setTitle("Insert name of game here");
        setLocationRelativeTo(null);
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        a.setPreferredSize(new Dimension(600, 600));
        add(a);
        pack();
        setVisible(true);
    }
}

So I set the preferred size of the JPanel to 600 by 600 and pack the frame, but the frame's size is still 0 by 0.

Why is this and how do I fix it?

4

3 回答 3

10

正如您所说,pack()将尝试安排窗口,以便将每个组件的大小调整为其首选大小。

问题在于布局管理器似乎是试图安排组件及其各自的首选大小的管理器。但是,当您将布局管理器设置为空时,没有人负责。

尝试评论该setLayout(null)行,你会看到结果。当然,对于一个完整的窗口,您将不得不选择并设置一个有意义的LayoutManager.

这对我来说很好:

import java.awt.Dimension;

import javax.swing.*;

public class Game extends JFrame {
    private static final long serialVersionUID = -7919358146481096788L;
    JPanel a = new JPanel();
    public static void main(String[] args) {
        new Game();
    }
    private Game() {
        setTitle("Insert name of game here");
        setLocationRelativeTo(null);
        //setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        a.setPreferredSize(new Dimension(600, 600));
        add(a);
        pack();
        setVisible(true);
    }
}
于 2012-08-13T17:21:59.390 回答
2

pack()查询父容器的首选大小而不是子容器的首选大小,因此您必须使用:

setPreferredSize(new Dimension(600, 600));

另一个注意事项是调用

setLocationRelativeTo(null);

afterpack()被调用来计算中心坐标:)

好的,刚刚发现那里的空布局,为什么不使用JFrame的默认BorderLayout呢?

于 2012-08-13T17:18:01.697 回答
2

你的问题是setLayout(null),因为文档说pack()

调整此窗口的大小以适合其子组件的首选大小和布局

因此没有布局它不能正确执行。

这对我来说似乎很好用:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JFrame {

    JPanel panel = new JPanel();

    private void createAndShowGUI() {
        setTitle("FrameDemo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel.setPreferredSize(new Dimension(600, 600));
        add(panel);

        //setLayout(null); //wont work with this call as pack() resizes according to layout manager
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Game().createAndShowGUI();
            }
        });
    }
}
于 2012-08-13T17:20:31.200 回答