Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 直接重写JComponent中的组件_Java_Swing_Jpanel_Extends_Jcomponent - Fatal编程技术网

Java 直接重写JComponent中的组件

Java 直接重写JComponent中的组件,java,swing,jpanel,extends,jcomponent,Java,Swing,Jpanel,Extends,Jcomponent,我对使用super.paintComponent(g)有点问题。 我使用2个类A扩展JPanel,B扩展A,如下所示: public class A extends JPanel { ... @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // code of A } 及 我这里的问题是,当B的对象调用paintComponent(g),它还调用super,super是

我对使用
super.paintComponent(g)有点问题。
我使用2个类A扩展JPanel,B扩展A,如下所示:

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

我这里的问题是,当B的对象调用
paintComponent(g)
,它还调用super,super是A的函数,然后执行我不想要的代码。 如何直接调用
paintComponent(g)JComponent
的code>而不调用

编辑: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);
    }
}

您可以提取一个或多个可被子类重写的方法,如:

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使用鼠标侦听器(而不是实现它)。

如果你不想
a
的行为,为什么要扩展
a
?删除
super.paintComponent(g)怎么样因为您不想执行A的
paintComponent()
方法?B是A的扩展,但它的
paintComponent(g)是多余的,因为我在B中画了更多的东西。B需要A的变量和函数来工作。问题只是绘图部分。调用
paintComponent(g)是否无用?请展示一个SSCCE,它演示了您想要实现的目标以及它如何不按预期工作@JBNizet小心-不调用super可能会违反组件的不透明约定。
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);
        }
    }

}