Leider implementieren java swing Komponten kein Clonable (clone()). Das macht es schwer ein bereits fertig gezeichnetes Panel in einem anderen Container nochmals darzustellen. In meinem Fall wollte ich ein JPanel an einen Druckservice übergeben welcher dieses dann in einer Vorschau vor dem Drucken darstellt.
Ein reparenting der Komponenten war nicht möglich, da sonst bei der Darstellung des Druckvorschaufensters das Panel in dem eigentlichen Dialog verschwindet.
Eine mögliche Lösung ist Serialisierung.
Die folgende Methode Serialisiert und Deserialisiert eine JComponent so dass dadurch ein Klon entsteht.
public JComponent cloneSwing(JComponent compSource) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(out);
objOut.writeObject(compSource);
objOut.flush();
ObjectInputStream objIn = new ObjectInputStream(
new ByteArrayInputStream(out.toByteArray()));
JComponent compClone = (JComponent) objIn.readObject();
objOut.close();
objIn.close();
return compClone;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Sollten eigene Oberflächenkomponenten im Einsatz sein, muss evtl. via transient der eine oder andere Member eine Klasse ausgeschlossen werden.