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

标签 java swing object arraylist awt

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

我尝试将数组转换为二维数组(未成功),并尝试将标识符附加到每个对象并将我从基本数组返回的内容打印到控制台,即 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()));
        }

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

最佳答案

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

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

编辑:

方法 1:您无权访问 ShapeClass

当一个对象被添加到一个集合(扩展泛型类型)时,该对象的实际类不会改变。您可以使用 .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(动态绑定(bind))

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

方法调用在Java中是动态绑定(bind)的。所以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. 
    }

关于java - 将不同对象类型的数组列表合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238676/

相关文章:

java - 扫描仪提示用户输入数字

java - 线程执行期间对象状态修改

swing - Java-读取复选框是否被选中

git - 为什么 git log --find-object 对于给定的 blob 会获得两个具有不同内容的文件提交?

java - 在没有 src/main/java 的情况下使用 Maven

java - 生成丰富的:menu hierarchical structure from rich:tree

java - 使用 sleep() 和 interrupt() 重用线程

java - 如何将 CardLayout 与 Netbeans GUI Builder 一起使用

javascript - 根据数组长度多次复制对象 - Angular 2+/JavaScript

java - 知道自己是谁