Как скопировать компонент Swing со своими свойствами в Java? - PullRequest
0 голосов
/ 30 апреля 2018

Как скопировать компонент 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);
        }
    }
}

1 Ответ

0 голосов
/ 30 апреля 2018

Cloneable сломан и не должен использоваться - его архитектура была по существу ошибочной, и это только там по причинам обратной совместимости.

Обычный подход в наши дни - использовать конструктор копирования , который вы можете определить для своего собственного объекта (или иногда определить служебный метод для клонирования отдельного объекта.) Однако, если вы используете много разных компонентов 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...