Java JPanel 未绘制

Java JPanel doesnt get painted

我正在编写一个简单的自上而下射击游戏,我正在尝试以活动方式呈现图形,这样 JPanel 就不会被 OS 重绘,我可以控制重绘。

我有一个 Level class,它使用屏幕 class (JPanel) 中的 x 和 y 位置以及关卡或实体的 BufferedImage 调用 render()。我现在的问题是 Screen class 中的 paintComponents() 方法永远不会被调用。我已经尝试了几个变体来解决这个问题。我也用 Canvas 尝试过,但是要么实体开始闪烁,要么我在 createBufferStrategy(3) 上遇到异常。无论如何,这是我的源代码,我真的不知道现在有什么问题。

编辑

这是代码的重要部分,它不起作用,重绘不调用 paintComponent...

public void render(){
    if(graphics != null){
        graphics.dispose();
    }
    repaint();
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(offScreen.getSubimage(0, 0, getWidth(), getHeight()), 0, 0, null);
    g.dispose();
    Toolkit.getDefaultToolkit().sync();
    offScreen.flush();
}

public void render(int x, int y, BufferedImage image) {
    graphics = offScreen.createGraphics();
    graphics.drawImage(image, x, y, null);
//  offScreenGraphics.dispose();
}

问题是 paintComponent 没有被调用,repaint() 什么也没调用,调试器只是检查它。

Canvas 尝试

这是我对 Canvas 的尝试,问题是我无法在取消注释的代码中创建 bufferStrategy。在另一种渲染方法中,它可以工作,但在那里没用。

    public void render() {
//  if (buffer == null) {
//      createBufferStrategy(2);
//      buffer = getBufferStrategy();
//  }

    Graphics g = buffer.getDrawGraphics();
    g.drawImage(offScreen, 0, 0, null);
    if (g != null) {
        g.dispose();
    }
    if(!buffer.contentsLost()){
        buffer.show();
    }

}

public void render(int x, int y, BufferedImage image) {
    if (buffer == null) {
        createBufferStrategy(2);
        buffer = getBufferStrategy();
    }
    Graphics g = offScreen.getGraphics();
    g.drawImage(image, x, y, null);
}

希望你能帮助我,也谢谢你对我的帮助。

如果你有其他改进,我也想听听。

您在 JPanel 上的 render 方法应该只更新状态,并且调用 repaint. The painting will be done in paintComponent 作为对 repaint.[=16= 的调用结果]