扩展javafx窗格的深层复制对象?

时间:2019-05-31 19:41:01

标签: java javafx clone deep-copy

我正在尝试深复制我的自定义对象“ Space”的数组,该数组扩展了Javafx Pane。

我尝试使用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。

谢谢。

1 个答案:

答案 0 :(得分:-1)

您可以使用序列化和随后的反序列化进行深度复制。 Web上有不错的工具。例如,来自Apache的SerializationUtils。

您可以执行以下操作:

Space clonedSpace = SerializationUtils.clone(space);

Docs