2013-12-08 3 views
1

super.paintComponent(g);을 사용하는 데 약간 문제가 있습니다. B의 목적은 paintComponent(g);를 호출 할 때JComponent에서 직접 paintComponent를 재정 의하여

public class A extends JPanel { 
... 
@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    // code of A 
} 

public class B extends A { 
... 
@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    // code of B 
} 

, 그것은 또한 호출 여기 내 문제가 있음 : 나는 확장 JPanel의와 B를 확장하는 A는 다음과 같이 두 클래스를 사용하고 있습니다 슈퍼는 A의 함수이며 내가 원하지 않는 코드를 실행합니다. paintComponent(g);JComponent으로 직접 호출하려면 어떻게해야합니까?

EDIT : A는 추상이 아니므로 A 객체를 인스턴스화 할 수 있습니다.
EDIT2 : : 여기 내 문제와 매우 유사하기 쉬운 예입니다

public class Polygon2 extends Polygon { 

    private boolean isClicked; 
    ... 
    public void setClicked(boolean clicked){ 
     isClicked = clicked; 
    } 
    public boolean isClicked() { 
     return clicked; 
    } 
} 

public class A extends JPanel { 

    protected Polygon2 polygon; 
    ... 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.drawPolygon(polygon); 
    } 
} 


public class B extends A implements MouseListener { 
    ... 
    @Override 
    public void mousePressed(MouseEvent e) { 
     if (polygon.contains(e.getX(), e.getY()) { // click on the polygon 
      polygon.setClicked(true); 
      repaint(); 
     } 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     polygon.setClicked(false); 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (polygon.isClicked()) { 
      g.setColor(Color.green); 
     } else { 
      g.setColor(Color.red); 
     } 
     g.drawPolygon(polygon); 
    } 
} 
+3

왜'A'의 행동을 원하지 않는다면'A'를 확장하고 있습니까? –

+1

A의'paintComponent()'메소드를 실행하지 않기 때문에'super.paintComponent (g);'를 제거하는 것은 어떻습니까? –

+0

B는 A의 확장이지만,'paintComponent (g);'는 B에 더 무언가를 그리기 때문에 중복됩니다. 그리고 B는 A의 변수와 함수가 필요합니다. 문제는 그려진 부분 일뿐입니다. – AntiRGen

답변

2
당신은 뭔가 같은 서브 클래스에 의해 오버라이드 (override) 할 수있는 하나 이상의 방법, 추출 할

:

public class A extends JPanel { 

    protected Polygon2 polygon; 
    ... 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     configureGraphics(g); 
     g.drawPolygon(polygon); 
    } 

    protected void configureGraphics(Graphics g) { 
     g.setColor(Color.red); 
    } 

} 

public class B extends A { 

    @Override 
    protected void configureGraphics(Graphics g) { 
     if (polygon.isClicked()) { 
      g.setColor(Color.green); 
     } else { 
      g.setColor(Color.red); 
     } 
    } 

} 

BTW, 일반적인 규칙은 public으로 사용되지 않는 public 메서드를 공개하지 않는 것입니다. 여기에서는 B가 mouseListener (구현하는 것)를 사용하도록 변환합니다.

관련 문제