首页 > 解决方案 > 扩展javafx窗格的深拷贝对象?

问题描述

我正在尝试深度复制我的自定义对象“Space”的数组,它扩展了 javafx 窗格。

我尝试过使用 Kryo 库并实现可克隆。我可以使用实际上不进行深度复制的变通办法,但这会使我的代码变得更加混乱 100 倍。

目前我有班级空间:

public class Space extends Pane {
    private boolean available = true;
    private boolean light;
    private int x;
    private int y;
    private Peice peice;
    private Label peiceImage;
    private Rectangle border;

    public Space() {}


    public Space(int x, int y, boolean light) {
        border = new Rectangle(80,80);
        if (!light) {
            border.setFill(Color.DARKGREEN);
            border.setStroke(Color.DARKGREEN);
        } else {
            border.setFill(null);
            border.setStroke(null);
        }

        peiceImage = new Label();
        peiceImage.setTranslateX(16);
        peiceImage.setTranslateY(16);
        getChildren().addAll(border,peiceImage);

        this.x = x;
        this.y = y;
        this.peice = null;
        this.light = light;
    }
    //other unimportant methods.
}

然后我尝试复制到另一个文件中:

   public Space[][] copyBoard(Space[][] thisBoard) {
        Kryo kryo = new Kryo();
        Space[][] copy = new Space[8][8];
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                Space thisSpace = thisBoard[x][y];
                try {
                    kryo.setRegistrationRequired(false);
                    copy[x][y] = kryo.copy(thisSpace); //TODO This causes exception, dosent work
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
        return copy;
    }

尝试使用 kryo 库时出现此错误:

com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): javafx.scene.layout.Region$3

但我绝不会致力于使用 kryo。

谢谢。

标签: javajavafxclonedeep-copy

解决方案


您可以使用序列化和随后的反序列化进行深度复制。在网络上有很好的工具可以做到这一点。例如来自 Apache 的 SerializationUtils。

您可以执行以下操作:

Space clonedSpace = SerializationUtils.clone(space);

文档


推荐阅读