Java 在JPanel上绘制组件,图像闪烁然后消失

Java 在JPanel上绘制组件,图像闪烁然后消失,java,swing,repaint,paintcomponent,Java,Swing,Repaint,Paintcomponent,我有一个JApplet(MainClass扩展了JApplet)、一个JPanel(ChartWindow扩展了JPanel)和一个Grafico类 问题是Grafico类实例有2个JPanel,应该显示2个图像(每个面板1个),但是图像显示了,过了一会儿它们就消失了:取而代之的是灰色背景(比如一个空JPanel)。每次(在ChartWindow类中进行的)repaint()调用都会发生这种情况 main类init()包含 chartwindow=new ChartWindow(); add(c

我有一个JApplet(MainClass扩展了JApplet)、一个JPanel(ChartWindow扩展了JPanel)和一个Grafico类

问题是Grafico类实例有2个JPanel,应该显示2个图像(每个面板1个),但是图像显示了,过了一会儿它们就消失了:取而代之的是灰色背景(比如一个空JPanel)。每次(在ChartWindow类中进行的)repaint()调用都会发生这种情况

main类
init()
包含

chartwindow=new ChartWindow();
add(chartwindow)
chartwindow有一个Grafico实例

它是图表窗口的
画图组件
(覆盖)

grafico的JPanel以这种方式添加到ChartWindow的构造函数中

grafico=new Grafico()
................
add(grafico.pannelloGrafico);
add(grafico.pannelloVolumi);

如果需要更多信息,请告诉我,非常感谢:-)

如果要在JPanel的paintComponent上绘制,则需要覆盖JPanel的paintComponent,而不是图表窗口的paintComponent。每次JPanel自己绘制时,默认绘制都会覆盖您的图像

     class PanelloVolumi extends JPanel{
         //some code

         public void paintComponent(Graphics g){

             //paint one image here
         }

     }
对另一个JPanel也一样


然后将这些JPanel的实例添加到小程序中。

谢谢。它工作了,我解决了问题,但我看到了闪烁。我所做的是像以前一样使用grafico.draw()制作图像,然后1)grafico.pannelloGrafico.setImg(immagineGrafico);2)在PannelloVolumi的paintComponent中,我用g.drawImage(img,0,0,this)绘制图像;听起来不错。闪烁可通过双缓冲固定。您使用的是哪个版本的Java?说我使用的是1.7.0_09。在添加一个JPanel并使用paintComponent()而不是旧的paint()将代码搞乱之前,双缓冲区已经开始工作了。也许我错过了什么?我创建了一个图像(immagineGrafico),然后得到它的graphics2D(使用imgGrafico=(graphics2D)immagineGrafico.getGraphics()),然后我用draw方法在其上书写,然后我使用pannelloGrafico.setImg(immagineGrafico)将图像设置为绘制。在此之后,PannelloGrafico的paintComponent(我使用g.drawImage(img…)在面板中绘制图像感谢VincentOn每次绘制调用它首先清除图形(通过超级调用),然后从头开始重新创建grafico图像,然后绘制图像。我想创建这个grafico图像是昂贵的,因此闪烁。最好创建一次,将图像保存为类中的一个字段,并每次重新绘制。仅在需要时重建图像(大小更改或数据更改)。我以前见过这段代码运行良好:是的,.draw()计算非常昂贵,但它的执行大约需要10/20毫秒。鼠标指针在他的位置上画了一个大十字架:比以前慢多了:-(你最终是如何让闪烁变为现实的?
     class PanelloVolumi extends JPanel{
         //some code

         public void paintComponent(Graphics g){

             //paint one image here
         }

     }