gpt4 book ai didi

java - 为什么JFrame的update、revalidate、repaint不更新窗口?

转载 作者:行者123 更新时间:2023-12-02 01:41:59 25 4
gpt4 key购买 nike

我正在尝试创建一个窗口框架来显示游戏窗口。我在 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()。我还尝试在 revalidateupdate 等的 drawBackgrounddrawGrid 中使用许多不同的组合和顺序。这些尝试似乎奏效了。我该如何解决这个问题?

最佳答案

嗯,Graphics g = this.getGraphics(); 将是一个很好的起点。由于 repaint 只是安排使用 RepaintManager 进行绘制过程,因此所有使用 getGraphics 的代码都将被忽略。

这不是自定义绘画的工作原理。 getGraphics 可以返回 null,并且最多是上一个绘制周期的快照,您在其中绘制的任何内容都将在下一个绘制周期中删除干净。

此外,不要处置您未创建的Graphics上下文,在某些系统上,这将阻止其他组件使用它

首先查看 Performing Custom PaintingPainting in AWT and Swing更好地了解绘画的工作原理以及应该如何使用它。

您也可能想通读 Concurrency in SwingHow to Use Swing Timers有关创建“主循环”以恒定速率更新 UI 的想法,因为 Swing 是单线程且不是线程安全的

关于java - 为什么JFrame的update、revalidate、repaint不更新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54340221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com