【发布时间】:2022-01-23 05:12:27
【问题描述】:
我正在尝试制作太空入侵者游戏
public static SpaceInvaders spaceinvaders;
public static Renderer renderer;
// Constructor
public SpaceInvaders() {
JInternalFrame frame = new JInternalFrame();
renderer = new Renderer();
frame.add(renderer);
frame.setSize(WIDTH, HEIGHT);
frame.setResizable(false);
frame.setVisible(true);
gameDisplay g = new gameDisplay(); // a JFrame Form
g.setVisible(true);
g.gameScreen.add(frame); // gameScreen is a JPanel
renderer.repaint();
}
public void repaint (Graphics g) {
g.setColor(Color.red);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
如果我运行它,我会得到一个填充了红色矩形的对话框的预期结果。但是如果我用 JFrame 替换 JInternalFrame,我会收到一条错误消息
IllegalArgumentException:向容器添加窗口
那么JInternalFrame和JFrame有什么区别,为什么我可以给前者加渲染器却不能给后者呢?
【问题讨论】:
-
JFrame是附加到本地对等点的“顶级”容器。就其本身而言,它不能添加到其他容器中(如您所见)。JInternalFrame是一个普通容器,被装饰成看起来像一个窗口(或至少一个用作“文档”界面的容器) -
哦,不要这样覆盖
repaint -
@MadProgrammer 哦,好的,谢谢。以这种方式覆盖重绘有什么问题?
-
我不确定它来自哪里,
repaint(Graphics)似乎不是基于 Swing 的方法,但一般来说,repaint(在 Swing 内)用于安排新的绘制为组件传递