当前位置: 首页 > 知识库问答 >
问题:

调整JFrame的大小以适应调整后的JPanel

姬坚成
2023-03-14

我对JPanel和JFrame还是个新手,可能没有按照我应该的方式使用它们。我正在尝试创建Pong游戏,在创建JFrame并将JPanel添加到它之后,我可以调整JPanel的大小,但我不知道如何调整JFrame的大小以适应它。Game类扩展了JPanel。

主:

    public static void main(String[] args) throws InterruptedException {
        int height = 500, width =(int) (height*1.56); //height = 500, width = 780;
        JFrame frame = new JFrame("Pong");
        Game game = new Game();
        frame.add(game);
        frame.setVisible(true);
        game.setSize(width, height);
        System.out.println(game.getHeight());
        System.out.println(game.getWidth());
        game.setBackground(Color.BLACK);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        System.out.println(frame.getHeight());
        System.out.println(frame.getWidth());
    }
500
780
39
136
500
780
*above* 500
*above* 780

编辑:

    public static void main(String[] args) throws InterruptedException {
        int height = 500, width =(int) (height*1.56); //height = 500, width = 780;
        JFrame frame = new JFrame("Pong");
        Game game = new Game();
        frame.add(game);
        frame.setVisible(true);
        game.setPreferredSize(new Dimension(width, height));
        frame.pack();
        System.out.println(game.getHeight());
        System.out.println(game.getWidth());
        game.setBackground(Color.BLACK);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        System.out.println(frame.getHeight());
        System.out.println(frame.getWidth());
    }

将setSize更改为setPreferredSize,然后为JFrame调用pack()就可以解决所有问题。

共有1个答案

牛越
2023-03-14

同样,处理首选的大小,并确保在添加组件后在您的JFrame上调用pack()。此外,重写getPreferredSize比调用setPreferredSize更好。例如:

import java.awt.Dimension;
import javax.swing.*;

public class Game extends JPanel {
    private static final int PREF_W = 400;
    private static final int PREF_H = 300;
    private int prefW;
    private int prefH;

    public Game(int prefW, int prefH) {
        this.prefW = prefW;
        this.prefH = prefH;
    }

    public Game() {
        this(PREF_W, PREF_H);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(prefW, prefH);
    }

    private static void createAndShowGui() {
        int height = 500; 
        int width =(int) (height*1.56); //height = 500, width = 780;

        Game game = new Game(width, height);

        JFrame frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(game);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        System.out.println("Frame size: " + frame.getSize());
        System.out.println("game size: " + game.getSize());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
 类似资料:
  • 下面是“DisplayImage”自定义面板相关部分的代码:

  • 我制作了一个包含三个jpanel的jframe,这三个panel将jframe分成三个相等的部分。每一个面板都包含一个图像。我想调整图像和面板的大小,当帧的大小从高到低的时候。有人能告诉我如何做吗。

  • 我正在尝试使图片适合JLabel。我希望将图片尺寸缩小到更适合我的Swing JPanel的尺寸。 我尝试使用setPreferredSize,但它不起作用。 我在想有没有一个简单的方法来做这件事?我应该为此缩放图像吗?

  • 问题内容: 我是Java的新手,开始学习挥杆技巧,并且在JFrame中调整JPanel的大小时遇到​​问题。我正在关注本教程: http://vincentramdhanie.blogspot.com/2009/11/cardlayout-with- netbeans.html 因为最终我将学习每种不同的布局,并且现在已经进入CardLayout。在上面,有一个JPanel用于状态面板。那也是我想

  • 我是Java新手,开始学习swing,在JFrame中调整JPanel的大小时遇到问题。我将学习本教程: http://vincentramdhanie.blogspot.com/2009/11/cardlayout-with-netbeans.html 因为最终我正在学习每一种不同的布局,现在我来到了CardLayout。在上面,有一个JPanel用于状态面板。这也是我想要做的,但是当我将一个J

  • 我试图通过反复更改上的图标来创建一个动画(旋转文本)。问题是这些图像的大小不相同,当它们大于第一个图像的大小时,它们就会被裁剪。 解决这一问题的一种方法是为设置PreferredSize以便所有图像都适合--但我想一定有一种方法可以直接调整包含的的大小? 在下面的代码中,我还尝试将全部删除,创建一个新的jlabel,然后添加新的jlabel,但效果是一样的。 整个面板将在一个applet中使用。