如何在保留其属性的同时复制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;
    }
}

09-27 07:10