2010-05-16 1 views
1

내 프로그램에 DoubleBuffer를 구현하는 데 문제가 있습니다. 텍스트 벽에서 희미 해지기 전에 많은 정보가 필요하다는 것을 알아야합니다. 내가 문제가 있다고 생각하는 실제 장소는 한 가지 방법입니다.DoubleBuffering in Java

최근 이중 버퍼링에 대한 gpwiki에 대한 자습서를 살펴본 후 doublebuffer를 구현하려고 시도하는 코드에 코드를 구현하려고 결정했습니다. 다음 오류가 발생합니다. "java.lang.IllegalStateException : 구성 요소에 유효한 피어가 있어야합니다."

당신이 알고 있다면 차이가 있는지 모르겠지만, 다음은 main 메소드가있는 코드입니다. 이것은 내부에 ChronosDisplay 클래스를 표시하는 프레임입니다. 나는 여기에

public class CDM extends JFrame 
{ 
    public CDM(String str) 
    { 
     super("CD:M - "+str); 
     try 
     { 
      ... 
      ChronosDisplay theGame = new ChronosDisplay(str); 
      ((Component)theGame).setFocusable(true); 
      add(theGame); 
     } 
     catch(Exception e) 
     { 
      System.out.println("CDM ERROR: " +e); 
     } 
    } 
    public static void main(String args[]) 
    { 
     CDM run = new CDM("DP_Mini"); 
    } 
} 

내가 문제가 (나는 문제가 paint() 메소드에 생각)있는 생각 코드입니다 "..."와 관련이없는 코드를 생략.

public class ChronosDisplay extends Canvas implements Runnable 
{ 
    String mapName; 
    public ChronosDisplay (String str) 
    { 
     mapName = str; 
     new Thread(this).start(); 
     setVisible(true); 
     createBufferStrategy(2); 
    } 
    public void paint(Graphics window) 
    { 
     BufferStrategy b = getBufferStrategy(); 
     Graphics g = null; 
     window.setColor(Color.white); 
     try 
     { 
      g = b.getDrawGraphics(); 
      paintMap(g); 
      paintUnits(g); 
      paintBullets(g); 
     } 
     finally 
     { g.dispose(); } 
     b.show(); 
     Toolkit.getDefaultToolkit().sync(); 
    } 
    public void paintMap(Graphics window) 
    { 
     TowerMap m = new TowerMap(); 
     try 
     { 
      m = new TowerMap(mapName); 
      for(int x=0; x<m.getRows()*50; x+=50) 
      { 
       for(int y = 0; y<m.getCols()*50; y+=50) 
        { 
         int tileType = m.getLocation(x/50,y/50); 
         Image img; 
         if(tileType == 0) 
         { 
          Tile0 t = new Tile0(x,y); 
          t.draw(window); 
         } 
         ...// More similar if statements for other integers 
      } 
      catch(Exception e) ... 
    } 
    ...// Additional methods not shown here 
    public void run() 
    { 
     try 
     { 
      while(true) 
      { 
       Thread.currentThread().sleep(20); 
       repaint(); 
      } 
     } 
     catch(Exception e) ... 
    } 
} 

당신이 (내가 중요한 의심) 궁금하다면이 클래스는 CDM 클래스에 표시되면, Tile0 클래스에서 무승부() 메소드는 다음과 같습니다

public void draw(Graphics window) 
{ 
    window.drawImage(img,getX(),getY(),50,50,null); 
} 

모든 포인터, 조언, 또는 해결책은 중대하게 평가된다. 시간 내 줘서 고마워! : D

답변

1

스윙은 기본적으로 이중 버퍼링되므로 직접 구현할 필요가 없습니다.

Swing 응용 프로그램에서 Canvas 클래스를 사용하면 안됩니다. AWT와 Swing 구성 요소를 섞어서는 안됩니다.

모든 스윙 구성 요소는 EDT에 만들어야합니다. 이를 수행하는 방법에 대한 예제는 Swing 튜토리얼을 참조하십시오.

+0

일반적인 방향으로 나를 가르쳐 주셔서 감사합니다, camikr. 하지만, EDT가 무엇인지 말해 주시겠습니까? Google에서 간단한 검색을 수행해도 관련된 결과가 나오지 않습니다. – exodrifter

+0

EDT는 이벤트 발송 스레드입니다. 자세한 내용은 "동시성"에 대한 스윙 튜토리얼의 섹션을 읽어보십시오. http://java.sun.com/docs/books/tutorial/uiswing/TOC.html – camickr

+0

다시 한번 감사드립니다. : D – exodrifter

0

일반적으로 이중 버퍼링과 관련된 오류는 대상이 아직 표시되지 않음을 의미합니다. 윈도우가 가시로 설정되고 더블 버퍼 전략이 만들어진 후 스레드 시작을 밀어 넣으십시오.

+0

죄송 생성자 메소드를 변경 ... 공개 ChronosDisplay (문자열 STR) { 맵 이름 = STR; setVisible (true); createBufferStrategy (2); 새 스레드 (this) .start(); } ... 문제가 해결되지 않음 (여전히 동일한 오류가 발생 함) – exodrifter

+0

가시성을 디스플레이 어블과 혼동하지 마십시오 – finnw

1

무시 addNotify() 만들고 거기에서 BufferStrategy :

public ChronosDisplay (String str) 
{ 
    mapName = str; 
    new Thread(this).start(); 
    // Note: no createBufferStrategy() or setVisible() 
} 

public void addNotify() { 
    super.addNotify(); 
    createBufferStrategy(2); 
} 
+0

흠, 흥미 롭습니다. 나는 언젠가 그것을 밖으로 시험해야 할 것이다 :) – exodrifter