【问题标题】:Extending the Graphics class in Java在 Java 中扩展 Graphics 类
【发布时间】:2016-10-09 12:24:39
【问题描述】:

我需要扩展 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。 有人知道我能做什么吗?

【问题讨论】:

    标签: java inheritance graphics extends


    【解决方案1】:

    本期:

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

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

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

    【讨论】:

      【解决方案2】:

      Graphics 类是抽象的,这意味着您不能从中创建对象。 这并不意味着您不能扩展它,而是意味着必须发生以下两种情况之一:

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

      我希望这会有所帮助。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-10-30
          • 2019-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-15
          • 1970-01-01
          • 2014-06-12
          相关资源
          最近更新 更多