【问题标题】:acquiring float properties from supclass to super从子类获取浮动属性到超
【发布时间】:2019-09-16 02:29:14
【问题描述】:

我正在为学校创建一个像应用程序这样的绘画项目,在我当前的代码中,我有几个子类和一个超级类。超级应该保存要绘制的形状数组,每个形状对象都应该是它自己的子类,我以后必须放入一个数组并从应用程序调用。我必须使用 JDesktopPane 和 JInternalFrame,我不能使用 Arraylists,而且我目前坚持尝试将我的 RectDraw 子类的 Float 转换为我的 super。所有这一切都是在最终将工具嵌套在一个名为 MyShapes 的超名称中之前。欢迎任何帮助。我不经常使用 jdesktopPane,而且我不擅长投射。

        public class myShapes {

            public void paint(Graphics g) {

                graphSettings = (Graphics2D)g;
                graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                graphSettings.setStroke(new BasicStroke(4));

                Iterator<Color> strokeCounter = shapeStroke.iterator();
                Iterator<Color> fillCounter = shapeFill.iterator();
                Iterator<Float> transCounter = transPercent.iterator();

                for (Shape s : shapes){
                    graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transCounter.next()));
                    graphSettings.setPaint(strokeCounter.next());
                    graphSettings.draw(s);
                    graphSettings.setPaint(fillCounter.next());
                    graphSettings.fill(s);
                    }


                if (drawStart != null && drawEnd != null){

                    graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.40f));
                    graphSettings.setPaint(Color.LIGHT_GRAY);

                    Shape aShape = null;                            

                    if (currentAction == 2){                            
                        RectDraw drawRectangle = new RectDraw();
                        aShape = drawRectangle(x1, y1, x2, y2);                     
                    } 
                    else if (currentAction == 3){                           
                        CircleDraw drawEllipse = new CircleDraw();
                        aShape = drawEllipse(x1, y1, x2, y2);
                    } 
                    else if (currentAction == 4) {
                        LineDraw drawLine = new LineDraw();
                        aShape = drawLine(x1, y1, x2, y2);
                    }

                    graphSettings.draw(aShape);
                    }
                }
            }

这些是我的子类

package mainPackage;

import java.awt.geom.Rectangle2D;

public class RectDraw extends myShapes {

public Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) {

    int RDx, RDy, RDwidth, RDheight;

    RDx = Math.min(x1, x2);
    RDy = Math.min(y1, y2);
    RDwidth = Math.abs(x1 - x2);
    RDheight = Math.abs(y1 - y2);

    return new Rectangle2D.Float(RDx, RDy, RDwidth, RDheight);
}
}

除了名字之外,其他的完全一样

public class CircleDraw extends myShapes {

public Ellipse2D.Float drawEllipse(int x1, int y1, int x2, int y2){

     int x = Math.min(x1, x2);
     int y = Math.min(y1, y2);
     int width = Math.abs(x1 - x2);
     int height = Math.abs(y1 - y2);

     return new Ellipse2D.Float(x, y, width, height);
 }
}


public class LineDraw extends myShapes {

    public Line2D.Float drawLine(int x1, int y1, int x2, int y2) {

        return new Line2D.Float(x1, y1, x2, y2);
    }
}

我不断得到无法解析为变量

【问题讨论】:

    标签: java casting awt multiple-inheritance superclass


    【解决方案1】:
      RectDraw drawRectangle = new RectDraw();
      aShape = drawRectangle(x1, y1, x2, y2);
    

    基于第一行drawRectangle是RectDraw的一个实例;

    在第二行中,您将参考名称“drawRectangle”与 RectDraw 类中的同名方法混淆了

    您必须使用 RectDraw 类的实例调用该方法,如下所示。为清楚起见更改实例名称

      RectDraw rectDraw = new RectDraw();
      aShape = rectDraw.drawRectangle(x1, y1, x2, y2); 
    

    所有形状的相同问题..

    此外,您还在循环中创建大量实例,这不是一个好习惯。

    而且你的问题太混乱了,请在提问时尽量说清楚,参考:- https://stackoverflow.com/help/how-to-ask :)

    【讨论】:

    • 我明白了。我道歉。你要做的事情太多了,我仍然不习惯在 java 中使用超类和继承结构。 c++ 和 c# 对我来说更容易
    • 无需道歉。只需确保在使用您选择的语言进行编码时坚持使用文档。并且使用 IDE 永远不会受到伤害,它会在您编码时向您显示很多编译时错误,如果其中任何一个解决了您的问题,请选择答案:)
    【解决方案2】:

    我想补充一点,这不是一个好的类层次结构。您的形状应该从基本形状抽象类扩展,然后在您的主要方法上,您可以创建一个形状列表。

    您无法访问“超类”对象,因为形状不是实例变量。我不会使用 myShapes 类,但如果必须,您可能应该将 Shape 方法与 Shape.java 类分开,并让 myShapes.java 类负责创建形状列表。

    abstract class Shape(){
        abstract void draw();
    }
    

    那么你的其他子类形状应该扩展并实现paint方法:

    public class Rectangle extends Shape(){
        //instance variables
        public void draw();
    }
    

    关于主要方法:

    Shape[] myShapesArray = new Shape()[10];
    

    我建议查找工厂模式。 Factory 使用它并清理代码会很有意义。此外,限制为数组而不使用列表会使绘图应用程序更难管理。因为您总是需要知道在数组初始化时需要多少项。

    【讨论】:

    • 感谢您的帮助。我还不擅长java,所以我还有很长的路要走
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2021-03-13
    相关资源
    最近更新 更多