2013-12-08 44 views
1

我在使用super.paintComponent(g);时遇到了一些问题。 我使用的是2类A延伸的JPanel和B延伸的如下:从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 
} 

我在这里的问题是,当B的对象调用paintComponent(g);,它也要求超级是A的功能,然后执行我不想要的代码。 如何在不调用A的重写函数的情况下直接调用paintComponent(g);JComponent

编辑:A不是抽象的,所以我可以instanciate它的一个对象。
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

如何删除'super.paintComponent(g);'因为您不希望A的'paintComponent()'方法被执行? –

+0

B是A的扩展,但它的'paintComponent(g);'是多余的,因为我在B中画了更多东西。而B需要A的变量和函数来工作。问题只是抽签的一部分。 – AntiRGen

回答

2

你会提取一个或多个方法可以被子类覆盖,是这样的:

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); 
     } 
    } 

} 

顺便说一句,一般的规则是不公开公开使用的公共方法:在这里转换为让B使用mouseListener(而不是实现它)。