2012-12-15 4 views
3

JApplet (MainClass가 JApplet을 확장), JPanel (ChartWindow가 JPanel을 확장) 및 Grafico 클래스를가집니다.JPanel의 paintComponent 이미지가 깜박 인 다음 사라집니다.

문제는 Grafico 클래스 인스턴스에 2 개의 이미지 (각 패널 당 1 개)를 표시해야하는 JPanel이 있지만 이미지가 표시되고 잠시 후 사라지는 것입니다. 대신 회색 배경이됩니다 (예 : 빈 JPanel). 이

은 MainClass init()

chartwindow=new ChartWindow(); 
add(chartwindow) 

chartwindow가 GRAFICO의 인스턴스가 포함합니다 (ChartWindow 클래스에서 만든) 모든 재 페인트() 호출에 발생합니다.

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

더 많은 정보를 필요로하는 경우에, 저에게 대단히 :-)를 ChartWindow의 GRAFICO의 JPanel의이 ChartWindow의 생성자에서이 방법을 추가

paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    Image immagineGrafico=createImage(grafico.pannelloGrafico.getWidth() 
      ,grafico.pannelloGrafico.getHeight()); 
    Image immagineVolumi=createImage(grafico.pannelloVolumi.getWidth() 
     ,grafico.pannelloVolumi.getHeight()); 
    Graphics2D imgGrafico=(Graphics2D)immagineGrafico.getGraphics(); 
    Graphics2D imgVolumi=(Graphics2D)immagineVolumi.getGraphics(); 
    grafico.draw(imgGrafico,imgVolumi,mouseX,mouseY); 

    ((Graphics2D)grafico.pannelloGrafico.getGraphics()).drawImage(immagineGrafico,0,0,this); 
    ((Graphics2D)grafico.pannelloVolumi.getGraphics()).drawImage(immagineVolumi,0,0,this); 
} 

paintComponent (재정의) 감사 메시지

+0

어떻게 깜박 거렸습니까? –

답변

2

페인트하려는 경우 JPanel의 paintComponent를 차트 창 대신 덮어 써야합니다. JPanel이 페인트 할 때마다 기본 페인트가 이미지를 덮어 쓰게됩니다.

 class PanelloVolumi extends JPanel{ 
     //some code 

     public void paintComponent(Graphics g){ 

      //paint one image here 
     } 

    } 

그리고 다른 JPanel에서도 마찬가지입니다.

그런 다음 이러한 JPanel의 인스턴스를 애플릿에 추가하십시오.

+0

감사합니다. 빈센트. 그것은 작동하고 문제를 해결했지만 깜박 거림이 보입니다. 내가 한 일은 이전처럼 grafico.draw(), 다음으로 1) grafico.pannelloGrafico.setImg (immagineGrafico); 2) PannelloVolumi의 paintComponent i에서 이미지를 g.drawImage (img, 0,0, this)로 그립니다. – mark

+0

좋은 소리. 플리커는 이중 버퍼링으로 고정 될 수 있습니다. 어떤 Java 버전을 사용하고 있습니까? –

+0

http://javatester.org에 의하면 1.7.0_09를 사용하고 있습니다. JPanel을 추가하고 이전 paint() 대신 paintComponent()를 사용하여 코드를 엉망으로 만들기 전에 이중 버퍼링이 작동하고있었습니다. 내가 뭔가를 놓친 것일까? 나는 imgGrafico = (Graphics2D) immagineGrafico.getGraphics()를 사용하여 graphics2D를 얻은 다음 draw 메서드에서 iwrite 한 다음 pannelloGrafico.setImg (immagineGrafico)를 사용하여 이미지를 페인트하도록 설정합니다. . 이 PannelloGrafico의 paintComponent (g.drawImage (img ...)를 사용하는 곳)가 panel의 빈센트에있는 그림을 페인트합니다. – mark

관련 문제