为什么 JFrame 的更新、重新验证和重新绘制不更新窗口?



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

嗯,Graphics g = this.getGraphics();是一个很好的起点。 由于repaint只是安排一个油漆传递与RepaintManager一起发生,所有使用getGraphics的代码都将被忽略。

这不是定制绘画的工作方式。 getGraphics可以返回null,充其量只是上一个绘画周期的快照,但您绘制的任何内容都将在下一个绘制周期中被擦拭干净。

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

首先查看在

AWT 和 Swing 中执行自定义绘画和绘画,以更好地了解绘画的工作原理以及您应该如何使用它。

您可能还希望通读 Swing 中的并发性和如何使用 Swing 计时器,以获取有关创建"主循环"以恒定速率更新 UI 的想法,因为 Swing 是单线程的,而不是线程安全的

相关内容

  • 没有找到相关文章

最新更新