在Java中扩展Graphics类

时间:2016-10-09 12:24:39

标签: java inheritance graphics extends

我需要扩展Graphics类,以便@Override某些方法,包括drawRect(int,int,int,int)drawRoundRect(int,int,int,int,int,int)。 但是,我不知道该怎么做。这是我到目前为止所得到的:

  public class myGraphics extends Graphics {
      @Override
      public void drawRect(int x, int y, int width, int height) {
          super.fillRect(x, y, width, height);
          setColor(Color.WHITE);
          super.fillRect(x, y, width-6, height-6);
      }

      @Override
      public void drawRoundRect(int x, int  y, int width, int height, int arcWidth, int arcHeight) {
          super.fillRoundRect(x, y, width, height, arcWidth, arcHeight);
          setColor(Color.WHITE);
          super.fillRoundRect(x, y, width-6, height-6, arcWidth, arcHeight);
        }
    }

我在课程申报行上收到错误说:myGraphics is not abstract and does not override abstract method dispose() in java.awt.Graphics 我在提及super.fill..(..)的每一行都收到错误:abstract method fill..(..) in java.awt.Graphics cannot be accessed directly。 有谁知道我该怎么做?

3 个答案:

答案 0 :(得分:2)

这个问题:

  

我需要扩展Graphics类以便@Override一些方法,包括drawRect(int,int,int,int)和drawRoundRect(int,int,int,int,int,int)。

...实际上可能是XY Problem,当最佳解决方案是使用完全不同的方法时,您会问如何解决特定的代码问题。最好是告诉我们您要解决的整体问题,而不是您目前正在尝试解决的问题:

如果你想改变你自己的图形程序的绘图行为,有更好的方法比尝试扩展图形,这是一个非常困难的任务,如果你真的必须承担它。相反,可以考虑使用扩展JPanel的类,并为其提供自己的drawRect和drawRoundRect方法,还要为其添加Graphics或Graphics2D参数,并在这些方法中执行所需的任何更改。

答案 1 :(得分:1)

Graphics类是抽象的,这意味着您无法从中创建对象。 这并不意味着你不能扩展它,但它确实意味着必须发生两个中的一个:

如果你扩展它,你必须显式覆盖(实际上写所有方法)它的所有方法。 另一种选择是让你的myGraphics类抽象化,但我认为这不是你想要的。

我希望这会有所帮助。

答案 2 :(得分:0)

作为一个抽象类,Graphics有很多抽象方法。抽象方法是未在抽象类中定义但必须在最终的子类中定义的方法。如果您不想立即定义抽象方法,则可以使子类成为抽象类,但是如果希望可以实例化该类,则最终必须定义这些方法。由于dispose()是一种抽象方法,因此您需要说出dispose()在子类中应该做什么,否则就可以使计算机认为您通过在{}之间不进行任何操作来告诉您要对dispose做什么。

我有一个类似的问题,我通过制作类SimpleGraphics来解决了。如果使myGraphics类扩展SimpleGraphics,则可能会解决您的问题。

import java.awt.*;
import javax.swing.JFrame;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
public class SimpleGraphics extends Graphics{
    public void clearRect(int x, int y, int width, int height){};
    public void clipRect(int x, int y, int width, int height){};
    public void copyArea(int x, int y, int width, int height, int dx, int dy){};
    public void dispose(){};
    public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle){};
    public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer){return false;};
    public boolean drawImage(Image img, int x, int y, ImageObserver observer){return false;};
    public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer){return false;};
    public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer){return false;};
    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer){return false;};
    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer){return false;};
    public void drawLine(int x1, int y1, int x2, int y2){};
    public void drawOval(int x, int y, int width, int height){};
    public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints){};
    public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints){};
    public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight){};
    public void drawString(AttributedCharacterIterator iterator, int x, int y){};
    public void drawString(String str, int x, int y){};
    public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle){};
    public void fillOval(int x, int y, int width, int height){};
    public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints){};
    public void fillRect(int x, int y, int width, int height){};
    public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight){};
    public Shape getClip(){return null;};
    public Rectangle getClipBounds(){return null;};
    public Color getColor(){return null;};
    public Font getFont(){return null;};
    public FontMetrics getFontMetrics(Font f){return null;};
    public void setClip(int x, int y, int width, int height){};
    public void setClip(Shape clip){};
    public void setColor(Color c){};
    public void setFont(Font font){};
    public void setPaintMode(){};
    public void setXORMode(Color c1){};
    public void translate(int x, int y){};
    public Graphics create(){return null;};
}