将不同对象类型的数组列表组合为一个

时间:2019-05-21 12:48:10

标签: java swing object arraylist awt

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

ive试图将数组转换为2d数组(失败),还尝试将标识符附加到每个对象,然后将从基数组中返回的内容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()));
        }

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

1 个答案:

答案 0 :(得分: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),则更容易实现相同的目的。在这种情况下,您只需要在paint()中定义方法ShapeClass,并在子类(例如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. 
    }