我正在尝试创建一个窗口框架来显示游戏窗口。我在GameWindow
类中扩展了JFrame
并创建了两个方法:drawBackground
,它用实心矩形填充屏幕,以及drawGrid
,它使用 for 循环绘制连续的线条来制作网格。这是我的代码。
public class GameWindow extends JFrame {
// instance variables, etc.
public GameWindow(int width, Color bgColor) {
super();
// ...
this.setVisible(true);
}
public void drawBackground() {
Graphics g = this.getGraphics();
g.setColor(bgColor);
g.fillRect(0, 0, this.getWidth(), this.getWidth());
// I suspect that the problem is here...
this.update(g);
this.revalidate();
this.repaint();
g.dispose();
}
public void drawGrid() {
Graphics g = this.getGraphics();
g.setColor(Color.BLACK);
for (int i = tileWidth; i < TILE_COUNT * tileWidth; i += tileWidth) {
g.drawLine(0, i * tileWidth, this.getWidth(), i * tileWidth);
g.drawLine(i * tileWidth, 0, i * tileWidth, this.getHeight());
}
// ... and here.
this.update(g);
this.revalidate();
this.repaint();
g.dispose();
}
}
但是,当我尝试在这样的程序中测试此类时:
public class Main {
public static void main(String[] args) {
GameWindow game = new GameWindow(700);
game.drawBackground();
game.drawGrid();
}
}
框架出现在屏幕上,但保持空白;背景和网格都没有被绘制。我试着Graphics g = this.getGraphics()
this.getContentPane().getGraphics()
.我还尝试在revalidate
、update
等drawBackground
和drawGrid
中使用许多不同的组合和顺序。这些尝试似乎都没有奏效。如何解决此问题?
嗯,Graphics g = this.getGraphics();
是一个很好的起点。 由于repaint
只是安排一个油漆传递与RepaintManager
一起发生,所有使用getGraphics
的代码都将被忽略。
这不是定制绘画的工作方式。 getGraphics
可以返回null
,充其量只是上一个绘画周期的快照,但您绘制的任何内容都将在下一个绘制周期中被擦拭干净。
另外,不要dispose
您未创建的Graphics
上下文,在某些系统上,这将阻止其他组件使用它
AWT 和 Swing 中执行自定义绘画和绘画,以更好地了解绘画的工作原理以及您应该如何使用它。
您可能还希望通读 Swing 中的并发性和如何使用 Swing 计时器,以获取有关创建"主循环"以恒定速率更新 UI 的想法,因为 Swing 是单线程的,而不是线程安全的