Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich wollte gerade das erste Mal versuchen ein JPanel zu klonen:
Code:
class MainGrid extends JPanel implements Cloneable {
[...]
Panel2 panel2 = new Panel2();
JPanel panel6 = (JPanel) panel2.clone();
[...] }
Nur leider wirft mir Eclipse die Fehlermeldung The method clone() from the type Object is not visible aus. Könnte mir jemand sagen, was ich falsch mache?
clone() ist normalerweise "protected", d.h. nur die Klasse in der "clone" definiert ist, und Unterklassen dieser Klasse, können die Methode aufrufen (also nur JPanel, JComponent, Container, Component und Object könnten die clone-Methode von JPanel aufrufen).
Da JPanel die clone-Methode nicht überschreibt, wird sie dir sowieso nix nützen, schreib dir eine eigene Kopier-Methode.
Die Klasse MainGrid überschreibt bereits die clone-Methode:
Code:
class MainGrid extends JPanel implements Cloneable{
public Object clone()
{
try
{
return super.clone();
}
catch (CloneNotSupportedException e) {
// this shouldn’t happen, since we are Cloneable
throw new InternalError();
}
}
Dennoch kommt die besagte Fehlermeldung. Wie ich meine eigene Kopiermethode basteln kann, weiß ich leider nicht, und finde auch im Netz auf die Schnelle keine Antwort. Könntet Ihr mir da weiter helfen?
P.S.: Code der Klasse Panel2:
Code:
package gui;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JSeparator;
class Panel2 extends JPanel {
public Panel2() {
super(new BorderLayout()); //overrides the layout with a BorderLayout
add(new JSeparator(JSeparator.VERTICAL), BorderLayout.CENTER); //adds vertical line
}
}
JPanel2 ist eine Ableitung von JPanel. JPanel liegt nicht im Package 'java.lang' und kann somit nicht auf die als "protected" deklarierte Methode "clone" zugreifen!
also wenn du in der einen Klasse clone() implementierst, kannst du sie nicht in einer anderen Klasse aufrufen...
wenn dann müsste es hessen:
Code:
class Panel2 extends JPanel implements clonable{
...
}
soviel ich weiss musst du in dieser Klasse dann clone() implementieren.
Es reicht nicht wenn du schreibst super().clone() da die super-Klasse kein clone kennt. du musst selbst entscheiden was geklont werden muss... das wären warscheinlich deine vars usw...
class Panel2 extends JPanel implements Cloneable {
public Object clone()
{
try
{
return super.clone();
}
catch ( CloneNotSupportedException e ) {
// this shouldn’t happen, since we are Cloneable
throw new InternalError();
}
}
public Panel2() {
super(new BorderLayout()); //overrides the layout with a BorderLayout
add(new JSeparator(JSeparator.VERTICAL), BorderLayout.CENTER); //adds vertical line
}
}
In Klasse MainGrid wird folgendermaßen geklont, wobei ich auch keine Fehlermeldung mehr bekomme:
Code:
Panel2 panel2 = new Panel2();
JPanel panel6 = (JPanel) panel2.clone();
Panel6 zeigt jetzt auch den vertikalen Separator aus Panel2 an, nur ist das JPanel Panel2 jetzt leer. Also scheint er nicht richtig geklont bzw. kopiert zu haben, sondern setzt nur den Zeiger um??
Alles klar, hab mir dank Forum doch noch eine eigene, echt einfache, Kopiermethode geschrieben:
Code:
class Panel2 extends JPanel {
/**
* method that allows cloning of a vertical JSeparator
*/
public Panel2 myclone(){
Panel2 clonePanel2 = new Panel2();
return clonePanel2;
}
[...]
}