gpt4 book ai didi

java - 直接从 JComponent 重写paintComponent

转载 作者:行者123 更新时间:2023-11-30 04:07:14 24 4
gpt4 key购买 nike

我在使用 super.paintComponent(g); 时遇到了一些问题。我正在使用 2 个扩展 JPanel 的类 A 和扩展 A 的 B 类,如下所示:

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 的函数 super,然后执行了我不想要的代码。如何直接调用 JComponentpaintComponent(g); 而不调用 A 的重写函数?

编辑:A不是抽象的,所以我可以实例化它的一个对象。
编辑2::这是一个简单的例子,与我的问题非常相似:

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

}

顺便说一句,一般规则是不要公开不打算公开使用的公共(public)方法:这里翻译为让 B 使用 mouseListener(而不是实现它)。

关于java - 直接从 JComponent 重写paintComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com