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