2012-03-19 1 views
0

안녕하세요 전문가 : JPanel을 확장 한 클래스가 있습니다. 이제 ShapePanel (Sp)이 정상적인 JPanel (컨테이너)에 추가되어 inturn이 JFrame (윈도우)에 추가됩니다. paintComponent 메서드에서 나는 ... 셰이프를 그리지 만 셰이프는 렌더링 후에 지속되지 않습니다. 디버거에서 크기가 변경 될 때마다 다시 그려지는 것을 볼 수 있습니다.JPanel에서 그려지는 객체의 지속성

는 지금은 JPanel의의의 오버로드 (SP의)를 paintComponent에와

super.paintComponent(g);   

    ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics()); 
    //for(Shape s : ArrayOfShapes) 
    { 
     if(s instanceof Rectangle) 
       SdG.Paint((Rectangle)s); 
      else if(s instanceof Triangle) 
       SdG.Paint((Triangle)s); 
      else 
       SdG.Paint((Circle)s); 
    } //s is a custom-shape object 

는 그래픽 객체이가 JPanel의 (명백하게)에서 오는 추가 ....

그러나 그려진 이미지는 결코 패널에 남아 없습니다 - 당신은 그것을 두번째로 보았고 그것도 사라졌습니다 ...

나는 약간의 탐색을했지만 아무 소용이 없습니다.

실제 도면

public ShapeDrawerGui(Graphics2D _g) 
{ 
    g = _g; 
    g.setColor(Color.Black); 
} 

@Override 
public void Paint(Circle c) 
{ 
    g.drawArc(0, 0, 50, 50, 0, 360); 
} 

@Override 
public void Paint(Triangle t) 
{   
    Polygon p = new Polygon(); 
    p.addPoint(0, 25); 
    p.addPoint(0 , 50); 
    p.addPoint(50, 50);  
    g.drawPolygon(p); 
} 

@Override 
public void Paint(Rectangle r) 
{ 
    g.drawRect(0, 0, 50, 50); 
} 

종류

마르쿠스

+0

당신은'Paint()'메소드를 대문자 P와 함께 사용합니다. - 아우 .. 글쎄, 그건 문제가되지 않습니다. –

+0

ShapeDrawerGui SdG = 새로운 ShapeDrawerGui ((Graphics2D) this.getGraphics());'ShapeDrawerGui SdG = 새로운 ShapeDrawerGui ((Graphics2D) g); ' –

+1

* "그래픽 개체는 (분명히) JPanel "* [SSCCE] (http://sscce.org/)는 일반적으로 일을 분명히합니다. –

답변

2

this.getGraphics 및 g 사이의 차이를 ..what이다 .. 관해서?

GUI를 그렇게 이야기 할 때 다시 칠하고, paint(Graphics) 또는 paintComponent(Graphics) 방법에 공급되는 Graphics 객체를 사용해야합니다. 이 메소드는 GUI에 의해 언제든지 호출 될 수 있으며, 예를 들어 다른 창 뒤에있는 경우 다시 그리기 할 수 있습니다.

getGraphics()을 호출하면 다음 페인트가 사라지는 비 지속성 그래픽 객체가 제공됩니다.

super.paintComponent(g);   

ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics()); 

gSdG 두 개의 서로 다른 개체 및 카운터 - 직관적으로, 당신의 전문 패널에 속한 g 항상 드로잉하는 것이 아니다 :

+0

+1 나는 그것을 간과했다. @Markus : 언 바운드 속성을 변경하면'repaint()'를 호출해야 할 수도 있습니다. – trashgod

1

다음은 문제입니다.

프로그램에 따라 캔버스에 그리는 데 사용할 수 있지만 g은 항상 마지막에 그려지고 SgD이 페인팅을 마친 후에도 유지됩니다. Graphics2DSgD DOES는 페인트하려는 구성 요소에 속하므로 (getGraphics()) 캔버스를 그리는 데 사용되는 그래픽을 의미하지는 않습니다.

나는 이것이 직관력이 없다는 것을 알고있다. 각 jJXXX에는, draw에 사용하는 관련한 Graphics object가 있습니다 만, Swing에 의해 사용되는 것을 의미하지는 않습니다.

paintComponent의 매개 변수를 통해 표시되는 그래픽은 getGraphics()에서 가져온 그래픽과 동일하지 않습니다. paintComponent()은 getGraphics를 호출하는 것과 동일한 객체의 메소드입니다.

그냥 paintComponent(Graphics g)이 문 첫 번째 줄에 부울을 설정,이를보고 싶다면 :

boolean sameObject = (g== getGraphics()) 

sameObject을 인쇄 할 수 있습니다. 단어 false이 표시됩니다.

두 가지 모두 화면에 그려지는 데 사용됩니다. 그 시간에 당신의 캔버스의 g이 그림을 그리기 때문입니다. 그러면 마이크로 초 후에 매개 변수로받은 g이 그림을 그리며 마지막으로 그립니다.

마지막으로 우승 한 선수가 승리합니다. 그것은 반전 쇼 다운의 일종입니다.