【问题标题】:Combining arraylists of different object types into one将不同对象类型的数组列表合并为一个
【发布时间】:2019-10-07 20:54:15
【问题描述】:

我有一些数组列表,其中包含基于类中的构造函数的对象(用于类似绘画的程序),并希望将它们全部放在同一个数组列表中,以便每个项目按顺序重绘。

我尝试将数组转换为二维数组(未成功),还尝试将标识符附加到每个对象并将我从基本数组返回的内容打印到控制台package1.package2.ShapeClas@<string of letters and numbers>未成功获得回报我可以做任何事情与。

我希望合并的数组与下面类似

public static ArrayList<ShapeClass> emptyRectangle = new ArrayList<ShapeClass>();
public static ArrayList<ShapeClass> filledRectangles = new ArrayList<ShapeClass>();
public static ArrayList<ShapeClass> lineArray = new ArrayList<ShapeClass>();

每个数组都由沿线创建的对象填充(如果这还不够,还有一些其他的帮助可以共享),形状的比例随着重新缩放时窗口的大小而变化

for (ShapeClass cr : emptyRectangle) {
            g.setColor(cr.getForeground());
            Rectangle2D r = cr.getRectangle();
            Graphics2D g2 = (Graphics2D) g;
            g2.draw(new Rectangle2D.Double(r.getX() * JPanel1.getWidth(), r.getY() 
                    * JPanel1.getHeight(),r.getWidth() * JPanel1.getWidth(), 
                    r.getHeight() * JPanel1.getHeight()));
        }

我希望能够将数组合并为一个,这样我就可以按顺序重新绘制每个元素,因为现在它们是按形状类型绘制的,因此一种形状类型总是与另一种重叠。我如何将它们放入一个奇异数组并成功识别要绘制的形状?

【问题讨论】:

标签: java swing object arraylist awt


【解决方案1】:

由于 ArrayList 类实现了 List 接口,您只需使用 List 接口中的.addAll(Collection c) 方法即可轻松实现。

ArrayList<ShapeClass> allShape = new ArrayList<>();    
allShape.addAll(emptyRectangle);
allShape.addAll(filledRectangles);
allShape.addAll(lineArray);

编辑:

方法 1:您无权访问 ShapeClass

当一个对象被添加到一个Collection(扩展泛型类型)时,该对象的实际类不会改变。您可以使用 .getClass() 方法取回其类。但是,在调用其方法之前,必须将其转换回其原始形式。

    for(ShapeClass shape: allShapes) {
        System.out.println(shape.getClass()); // class <actual class>
        if(shape instanceof Triangle) {
            Triangle tri = (Triangle) shape;
            tri.paint();
        } else if(shape instanceof Rectangle) {
            Rectangle rec = (Rectangle) shape;
            rec.paint();
        }
    }

方法 2(更好):您可以访问 ShapeClass(动态绑定)

如果您可以访问通用类(即 ShapeClass),则更容易实现相同的目的。在这种情况下,您只需在ShapeClass 中定义一个方法paint(),并在子类中覆盖它(例如Rectangle)。

方法调用在 Java 中是动态绑定的。所以JVM会检查实际类型并为你调用最具体的方法

    ArrayList<ShapeClass> allShape = new ArrayList<>();
    allShape.addAll(emptyRectangle);
    allShape.addAll(filledRectangles);
    allShape.addAll(lineArray);

    for(ShapeClass shape: allShape) {
        shape.paint();   // make sure you have a paint() method in the ShapeClass, and it is overriden in the subclass. 
    }

【讨论】:

  • 是的,但是当我想重绘它们时,我不知道如何使用正确的方法,因为每个形状都需要自己的方法才能正确绘制,因为形状使用不同的调用,我不能使用这些不同的调用没有识别形状,但不知道如何附加该识别(尝试了一个二维数组,它具有一个识别属性然后是形状值,但不会工作)
  • @Anan 我编辑了我的答案,以展示如何识别形状并调用自己的方法进行绘制。希望这会有所帮助。
猜你喜欢
  • 2021-10-29
  • 2021-01-21
  • 2019-09-08
  • 2018-04-21
  • 2019-06-09
  • 1970-01-01
  • 2018-04-08
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多