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;
}
}