Java Swing 提供了较为完整的桌面窗口开发能力,制作简单的 Java 游戏时,可以直接使用 JFrame 作为游戏窗口。对于一些练习性质的小游戏、像素游戏或固定分辨率的小游戏,将窗口尺寸设置为 200x200 是一种常见需求。
一、使用 JFrame 设置 200x200 游戏窗口
JFrame 是 Swing 中用于创建顶层窗口的核心类。通过 setSize() 方法即可指定窗口的宽度和高度。
Javaimport 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。
其中:
Javaframe.setSize(200, 200);
第一个参数代表窗口宽度,第二个参数代表窗口高度,因此最终尺寸就是 200x200 像素。
二、推荐使用 setSize(200, 200)
如果游戏要求窗口固定为 200×200 像素,最直接的方式就是:
Javaframe.setSize(200, 200);
完整示例可以写成:
Javaimport 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); } }
这里增加了两个比较实用的设置:
Javaframe.setResizable(false);
禁止用户通过鼠标拖拽改变窗口大小,使游戏始终保持 200×200 的固定尺寸。
Javaframe.setLocationRelativeTo(null);
让窗口显示在屏幕中央,比默认出现在屏幕左上角更加适合游戏程序。
三、需要注意窗口尺寸与游戏区域尺寸的区别
很多初学者容易把 JFrame 的窗口尺寸和游戏实际绘制区域混为一谈。
例如:
Javaframe.setSize(200, 200);
这里设置的是整个顶层窗口的尺寸,并不意味着 JPanel 一定能够获得完整的 200x200 绘制区域。
因为 JFrame 通常还包含标题栏和边框,这些装饰部分也会占用空间。因此,如果游戏要求“实际游戏画布必须是 200×200”,更推荐通过内容面板的尺寸来控制。
例如:
Javaimport 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); } }
这里使用:
JavagamePanel.setPreferredSize(new Dimension(200, 200)); frame.pack();
让游戏面板的首选尺寸保持为 200x200,然后由 pack() 根据组件的首选尺寸计算窗口所需大小。
这种方式对于实际的 Swing 游戏开发通常更加合理。
四、setSize 与 pack 的选择
两种方式各有适用场景。
直接使用:
Javaframe.setSize(200, 200);
适合明确要求整个窗口尺寸为 200×200 的情况,代码简单,也非常直观。
如果要求游戏绘制区域为 200×200,则可以采用:
JavagamePanel.setPreferredSize(new Dimension(200, 200)); frame.pack();
这种方式能够避免把窗口装饰区域计算进游戏画布尺寸。
因此,如果需求是“创建一个 200×200 的 Java Swing 窗口”,可以优先考虑 setSize();如果需求是“创建一个实际游戏画面为 200×200 的窗口”,则更推荐 setPreferredSize() 配合 pack()。
五、创建 200x200 游戏画布
实际开发小游戏时,通常不会直接在 JFrame 上绘制,而是创建一个继承自 JPanel 的游戏面板。
例如:
Javaimport 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,黑色背景中绘制了一个红色方块。
这里的:
Javag.fillRect(80, 80, 40, 40);
表示从坐标 (80, 80) 开始绘制一个宽度和高度均为 40 的矩形。
由于游戏区域是 200x200,坐标范围大致可以理解为:
(0, 0) ---------------- (200, 0) | | | 游戏区域 | | | | | (0, 200) -------------- (200, 200)
Swing 的绘图坐标原点位于组件左上角,向右为 X 轴正方向,向下为 Y 轴正方向。
六、为什么设置 200x200 后窗口看起来可能不是正方形
如果代码使用:
Javaframe.setSize(200, 200);
正常情况下,Java 会按照窗口整体尺寸创建一个 200×200 的顶层窗口。
但是窗口标题栏、边框等装饰由操作系统负责绘制,因此用户看到的游戏内容区域并不会严格等于 200×200。
例如,窗口总尺寸可能是:
窗口整体:200 × 200 游戏内容:小于 200 × 200
这并不是 setSize() 失效,而是因为 JFrame 的尺寸包含了窗口装饰区域。
如果希望绘制区域严格保持 200x200,可以改用:
JavasetPreferredSize(new Dimension(200, 200)); pack();
这样更符合 Swing 组件布局的工作方式。
七、让 200x200 游戏窗口禁止缩放
小游戏通常需要固定分辨率。如果允许用户随意调整窗口大小,游戏中的坐标、图片和碰撞区域可能发生变化。
可以通过:
Javaframe.setResizable(false);
关闭窗口缩放功能。
完整写法:
JavaJFrame frame = new JFrame("小游戏"); frame.setSize(200, 200); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true);
如果使用游戏面板:
JavaJPanel 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 实现周期性刷新:
JavaTimer 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 的网格:
Javaint cellSize = 20; int width = 200; int height = 200; int columns = width / cellSize; int rows = height / cellSize;
最终得到:
10列 × 10行
蛇、食物等游戏对象就可以直接使用网格坐标进行管理。
十、完整的200x200 Java Swing游戏窗口示例
综合窗口、游戏面板、固定尺寸和绘制逻辑,可以写成下面的形式:
Javaimport 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 负责游戏画面绘制,后续还可以继续加入键盘监听、鼠标操作、游戏状态、碰撞检测和动画刷新等功能。
十一、常见问题排查
如果设置了:
Javaframe.setSize(200, 200);
但实际效果与预期不一致,可以重点检查以下几个方面。
窗口可以被拖大或缩小
检查是否调用:
Javaframe.setResizable(false);
游戏区域不是 200×200
不要只设置 JFrame 的大小,可以改成:
Javapanel.setPreferredSize(new Dimension(200, 200)); frame.pack();
窗口位置不合适
可以使用:
Javaframe.setLocationRelativeTo(null);
让窗口居中。
关闭窗口后程序仍然运行
确认设置:
Javaframe.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,可以直接使用:
Javaframe.setSize(200, 200);
如果真正需要控制游戏画布为 200×200,更推荐采用:
Javapanel.setPreferredSize(new Dimension(200, 200)); frame.pack();
再结合:
Javaframe.setResizable(false); frame.setLocationRelativeTo(null);
即可获得一个固定尺寸、居中显示的游戏窗口。
对于后续的 Java Swing 游戏开发,可以进一步在 JPanel 中实现游戏绘制,通过键盘监听实现角色控制,再使用 Timer 驱动游戏状态更新。对于简单的 2D 游戏而言,这套结构足以完成从窗口创建到基本游戏循环的大部分功能。