如何在保留其属性的同时复制Swing组件?我已经使用clone()
方法尝试过此方法,但是它失败并显示错误:
clone()
在java.lang.Object中具有受保护的访问
我应该如何使用代码复制Swing组件?
这是我目前的代码:
public void copy_component() throws CloneNotSupportedException {
Component[] components = design_panel.getComponents();
for (int i = 0; i < components.length; i++) {
boolean enable = components[i].isEnabled();
if (enable == true) {
JButton button = components[i].clone();
design_panel.add(button);
}
}
}
最佳答案
Cloneable
损坏,不应使用-它的体系结构本质上是错误的,并且仅出于向后兼容的原因而存在。
如今,通常的方法是使用copy constructor,您可以在自己的对象上定义(或者有时定义实用程序方法来克隆单独的对象。)但是,如果使用的是许多不同的Swing组件,则可以有点痛苦
另一种方法是来回序列化对象,这具有创建深度克隆的对象的作用。这有点骇人听闻,并且仅在对象为Serializable
时才起作用,但是由于Swing组件符合此描述,因此您可以使用以下内容:
private Component cloneSwingComponent(Component c) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(c);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (Component) ois.readObject();
} catch (IOException|ClassNotFoundException ex) {
ex.printStackTrace();
return null;
}
}