Java JPanel不会上漆

Java JPanel不会上漆,java,swing,jpanel,Java,Swing,Jpanel,我正在编写一个简单的自顶向下的快照程序,我正在尝试以活动方式渲染图形,这样JPanel就不会被操作系统重新绘制,我可以控制重新绘制 我有一个Level类,它使用Screen类(JPanel)中级别或实体的x和y位置以及buffereImage调用render()。我现在的问题是Screen类中的paintComponents()方法从未被调用。我尝试了几个变体来解决这个问题。我也在Canvas上尝试过,但不是entites开始闪烁,就是createBufferStrategy(3)出现异常。无论

我正在编写一个简单的自顶向下的快照程序,我正在尝试以活动方式渲染图形,这样JPanel就不会被操作系统重新绘制,我可以控制重新绘制

我有一个Level类,它使用Screen类(JPanel)中级别或实体的x和y位置以及buffereImage调用render()。我现在的问题是Screen类中的paintComponents()方法从未被调用。我尝试了几个变体来解决这个问题。我也在Canvas上尝试过,但不是entites开始闪烁,就是createBufferStrategy(3)出现异常。无论如何,这是我现在的源代码,我真的不知道现在有什么问题。

编辑 这是代码中不起作用的重要部分,repaint不调用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的尝试,问题是我无法在注释外的代码中创建缓冲策略。在另一种渲染方法中,它可以工作,但没有用

    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

,您可能打算覆盖
paintComponent()
,而不是
paintComponents()
,因此将在中完成绘制。这可能是一个简单的错误,需要执行大量代码。考虑提供一个在任何情况下,都不要使用
Canvas
。您可能需要调用
repaint
,以“强制”调用
paintComponent
。屏幕外缓冲区的大小应与组件的大小相同。如果你想完全控制绘画过程,而不是这样做,那么你应该考虑使用,好的,我会用PrimeToCultType()来试试。MadProgrammer如何将BufferStrategy用于JPanel?并且offScreen.getSubimage()也可以工作吗?您不能将
BufferStrategy
JPanel
一起使用,您必须使用
Canvas
,这将从Swing的绘制过程中移除该过程,并为您提供对其的直接控制