java - 扩展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。
谢谢。
解决方案
您可以使用序列化和随后的反序列化进行深度复制。在网络上有很好的工具可以做到这一点。例如来自 Apache 的 SerializationUtils。
您可以执行以下操作:
Space clonedSpace = SerializationUtils.clone(space);
推荐阅读
- html - 如何使用ngIf在每次点击时继续添加文本框
- javascript - 无法在 React 中检索 prop 的值
- laravel - Admin and user login on same browser with same time in laravel
- reactjs - reactjs中的切换类
- arduino - 为什么 ESP32 没有接收到发送的 wifi 信号?
- linux-kernel - 尝试在 CentOS 7.7 上跟踪探测时在“性能报告”中看不到内核符号
- vue.js - b-nav-item 中的 v-for 不呈现
- asp.net-mvc - 从 Angularjs 迁移到 Blazor
- c# - 如何使用双向数据绑定而不是一对一转换?
- sql-server - GROUP BY 最新用户但最新日期没有用户