使用Java Swing设置游戏窗口大小为200x200

6 次阅读

Java Swing 提供了较为完整的桌面窗口开发能力,制作简单的 Java 游戏时,可以直接使用 JFrame 作为游戏窗口。对于一些练习性质的小游戏、像素游戏或固定分辨率的小游戏,将窗口尺寸设置为 200x200 是一种常见需求。

一、使用 JFrame 设置 200x200 游戏窗口

JFrame 是 Swing 中用于创建顶层窗口的核心类。通过 setSize() 方法即可指定窗口的宽度和高度。

Java
import javax.swing.JFrame;

public class Game {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Java游戏");

        frame.setSize(200, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

运行程序后,会创建一个标题为“Java游戏”的窗口,窗口尺寸设置为宽度 200、高度 200。

其中:

Java
frame.setSize(200, 200);

第一个参数代表窗口宽度,第二个参数代表窗口高度,因此最终尺寸就是 200x200 像素。

二、推荐使用 setSize(200, 200)

如果游戏要求窗口固定为 200×200 像素,最直接的方式就是:

Java
frame.setSize(200, 200);

完整示例可以写成:

Java
import javax.swing.JFrame;

public class GameWindow {

    public static void main(String[] args) {
        JFrame frame = new JFrame("200x200小游戏");

        frame.setSize(200, 200);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

这里增加了两个比较实用的设置:

Java
frame.setResizable(false);

禁止用户通过鼠标拖拽改变窗口大小,使游戏始终保持 200×200 的固定尺寸。

Java
frame.setLocationRelativeTo(null);

让窗口显示在屏幕中央,比默认出现在屏幕左上角更加适合游戏程序。

三、需要注意窗口尺寸与游戏区域尺寸的区别

很多初学者容易把 JFrame 的窗口尺寸和游戏实际绘制区域混为一谈。

例如:

Java
frame.setSize(200, 200);

这里设置的是整个顶层窗口的尺寸,并不意味着 JPanel 一定能够获得完整的 200x200 绘制区域。

因为 JFrame 通常还包含标题栏和边框,这些装饰部分也会占用空间。因此,如果游戏要求“实际游戏画布必须是 200×200”,更推荐通过内容面板的尺寸来控制。

例如:

Java
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameWindow {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Java小游戏");

        JPanel gamePanel = new JPanel();
        gamePanel.setPreferredSize(new java.awt.Dimension(200, 200));

        frame.setContentPane(gamePanel);
        frame.pack();

        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

这里使用:

Java
gamePanel.setPreferredSize(new Dimension(200, 200));
frame.pack();

让游戏面板的首选尺寸保持为 200x200,然后由 pack() 根据组件的首选尺寸计算窗口所需大小。

这种方式对于实际的 Swing 游戏开发通常更加合理。

四、setSize 与 pack 的选择

两种方式各有适用场景。

直接使用:

Java
frame.setSize(200, 200);

适合明确要求整个窗口尺寸为 200×200 的情况,代码简单,也非常直观。

如果要求游戏绘制区域为 200×200,则可以采用:

Java
gamePanel.setPreferredSize(new Dimension(200, 200));
frame.pack();

这种方式能够避免把窗口装饰区域计算进游戏画布尺寸。

因此,如果需求是“创建一个 200×200 的 Java Swing 窗口”,可以优先考虑 setSize();如果需求是“创建一个实际游戏画面为 200×200 的窗口”,则更推荐 setPreferredSize() 配合 pack()。

五、创建 200x200 游戏画布

实际开发小游戏时,通常不会直接在 JFrame 上绘制,而是创建一个继承自 JPanel 的游戏面板。

例如:

Java
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

public class GamePanel extends JPanel {

    public GamePanel() {
        setPreferredSize(new Dimension(200, 200));
        setBackground(Color.BLACK);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.RED);
        g.fillRect(80, 80, 40, 40);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("200x200 Java游戏");

        frame.setContentPane(new GamePanel());
        frame.pack();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

程序运行后,游戏面板为 200x200,黑色背景中绘制了一个红色方块。

这里的:

Java
g.fillRect(80, 80, 40, 40);

表示从坐标 (80, 80) 开始绘制一个宽度和高度均为 40 的矩形。

由于游戏区域是 200x200,坐标范围大致可以理解为:

(0, 0) ---------------- (200, 0)
  |                         |
  |        游戏区域         |
  |                         |
  |                         |
(0, 200) -------------- (200, 200)

Swing 的绘图坐标原点位于组件左上角,向右为 X 轴正方向,向下为 Y 轴正方向。

六、为什么设置 200x200 后窗口看起来可能不是正方形

如果代码使用:

Java
frame.setSize(200, 200);

正常情况下,Java 会按照窗口整体尺寸创建一个 200×200 的顶层窗口。

但是窗口标题栏、边框等装饰由操作系统负责绘制,因此用户看到的游戏内容区域并不会严格等于 200×200。

例如,窗口总尺寸可能是:

窗口整体:200 × 200
游戏内容:小于 200 × 200

这并不是 setSize() 失效,而是因为 JFrame 的尺寸包含了窗口装饰区域。

如果希望绘制区域严格保持 200x200,可以改用:

Java
setPreferredSize(new Dimension(200, 200));
pack();

这样更符合 Swing 组件布局的工作方式。

七、让 200x200 游戏窗口禁止缩放

小游戏通常需要固定分辨率。如果允许用户随意调整窗口大小,游戏中的坐标、图片和碰撞区域可能发生变化。

可以通过:

Java
frame.setResizable(false);

关闭窗口缩放功能。

完整写法:

Java
JFrame frame = new JFrame("小游戏");
frame.setSize(200, 200);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

如果使用游戏面板:

Java
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(200, 200));

JFrame frame = new JFrame("小游戏");
frame.setContentPane(panel);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

第二种方案更加适合后续继续开发游戏逻辑。

八、避免在主线程中直接处理复杂游戏循环

Swing 使用事件派发线程(EDT)处理界面事件。如果游戏程序包含动画、键盘控制或持续刷新的游戏循环,不建议在 EDT 中执行耗时操作,否则可能造成窗口卡顿甚至无法响应。

简单的 Swing 游戏可以使用 javax.swing.Timer 实现周期性刷新:

Java
Timer timer = new Timer(16, e -> {
    // 更新游戏状态
    gamePanel.repaint();
});

timer.start();

大约每 16 毫秒刷新一次,对应接近 60 FPS。

需要注意的是,60 FPS 并不意味着每次刷新都一定严格间隔 16.67 毫秒。对于简单小游戏来说,Swing Timer 通常已经足够;如果需要更加精确的高性能游戏循环,则应考虑其他技术方案。

九、200x200窗口适合哪些游戏

200x200 属于比较小的游戏画面尺寸,适合制作一些规则简单、画面元素较少的小游戏,例如:

  • 贪吃蛇

  • 俄罗斯方块

  • 简单飞机游戏

  • 像素风格小游戏

  • 方块碰撞游戏

  • 简单迷宫

  • 2048 类小游戏

  • Java Swing 图形界面练习项目

尤其是贪吃蛇等基于网格移动的游戏,200×200 的尺寸非常方便进行坐标计算。

例如将游戏区域划分为 20×20 的网格:

Java
int cellSize = 20;
int width = 200;
int height = 200;

int columns = width / cellSize;
int rows = height / cellSize;

最终得到:

10列 × 10行

蛇、食物等游戏对象就可以直接使用网格坐标进行管理。

十、完整的200x200 Java Swing游戏窗口示例

综合窗口、游戏面板、固定尺寸和绘制逻辑,可以写成下面的形式:

Java
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

public class SimpleGame extends JPanel {

    public SimpleGame() {
        setPreferredSize(new Dimension(200, 200));
        setBackground(Color.BLACK);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.GREEN);
        g.fillRect(50, 50, 30, 30);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Java Swing 200x200游戏");

        frame.setContentPane(new SimpleGame());
        frame.pack();

        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

这段代码采用了比较典型的 Swing 游戏窗口结构:

JFrame
 └── JPanel
      └── 游戏绘制区域

JFrame 负责窗口管理,JPanel 负责游戏画面绘制,后续还可以继续加入键盘监听、鼠标操作、游戏状态、碰撞检测和动画刷新等功能。

十一、常见问题排查

如果设置了:

Java
frame.setSize(200, 200);

但实际效果与预期不一致,可以重点检查以下几个方面。

窗口可以被拖大或缩小

检查是否调用:

Java
frame.setResizable(false);

游戏区域不是 200×200

不要只设置 JFrame 的大小,可以改成:

Java
panel.setPreferredSize(new Dimension(200, 200));
frame.pack();

窗口位置不合适

可以使用:

Java
frame.setLocationRelativeTo(null);

让窗口居中。

关闭窗口后程序仍然运行

确认设置:

Java
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

否则窗口关闭操作可能不会终止 Java 虚拟机。

界面绘制后没有正确显示

自定义 JPanel 时,应将绘制代码放入:

Java
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // 绘制游戏内容
}

不要直接覆盖 paintComponent() 后忘记调用父类方法,否则可能产生背景残留等绘制问题。

十二、总结

使用 Java Swing 创建 200×200 游戏窗口并不复杂。若只要求整个 JFrame 的尺寸为 200×200,可以直接使用:

Java
frame.setSize(200, 200);

如果真正需要控制游戏画布为 200×200,更推荐采用:

Java
panel.setPreferredSize(new Dimension(200, 200));
frame.pack();

再结合:

Java
frame.setResizable(false);
frame.setLocationRelativeTo(null);

即可获得一个固定尺寸、居中显示的游戏窗口。

对于后续的 Java Swing 游戏开发,可以进一步在 JPanel 中实现游戏绘制,通过键盘监听实现角色控制,再使用 Timer 驱动游戏状态更新。对于简单的 2D 游戏而言,这套结构足以完成从窗口创建到基本游戏循环的大部分功能。