Ich befasse mich mit einer Klasse die ich als Erweiteung von JTree baue. Ich habe meinen Code auf den Kern des Problems bereinigt (siehe unten). Dabei stosse ich auf die Fehlermeldung, wonach die Methode add nicht für den Knoten-Typ DefaultMutableTreeNode existiert.
Ich stehe auf dem Schlauch wieso das so ist, und vor allem wie ich das lösen kann.
Muss ich meine Klasse Baum von einer weiteren Klasse erben lassen ?
Ich empfehle erstmal das Lesen von: https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html
Wenn du mit einem Node als Wurzel arbeitest, dann musst du den JTree bereits mit diesem Node in seinem Konstruktor initialisieren.
Einen Node kann man nicht mehr im Nachhinein zum JTree hinzufügen.
Also z.B. so:
Ich empfehle erstmal das Lesen von: https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html
Wenn du mit einem Node als Wurzel arbeitest, dann musst du den JTree bereits mit diesem Node in seinem Konstruktor initialisieren.
Einen Node kann man nicht mehr im Nachhinein zum JTree hinzufügen.
Also z.B. so:
Ich befasse mich mit einer Klasse die ich als Erweiteung von JTree baue. Ich habe meinen Code auf den Kern des Problems bereinigt (siehe unten). Dabei stosse ich auf die Fehlermeldung, wonach die Methode add nicht für den Knoten-Typ DefaultMutableTreeNode existiert.
Weil Du JTree nicht verstanden hast.
Der Baum wird über den Startknoten gesteuert nicht mittels JTree.
Java:
DefaultMutableTreeNode root =newDefaultMutableTreeNode("Root");JTree tree =newJTree(root);String[]names ={"Paul","Peter","Hans"};for(String s : names )
root.add(newDefaultMutableTreeNode( s ));
Ich empfehle erstmal das Lesen von: https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html
Wenn du mit einem Node als Wurzel arbeitest, dann musst du den JTree bereits mit diesem Node in seinem Konstruktor initialisieren.
Einen Node kann man nicht mehr im Nachhinein zum JTree hinzufügen.
Also z.B. so:
Danke erstmal für den Tipp. Ich werde auf die Doku lesen.
Das mit der Wurzel im Konstruktor leuchtet mir ein. Ich war schon auf das Problem gestossen, dass ich nichts vom dem Aufruf des Konstruktors der Superklasse haben darf. Daher den Trick mit der Wurzel als Klassenvariable. Müsste diese nicht eher static sein ?
Ok.
Aber funktioniert bei mir mit "final" nicht. Dann heisst es "Cannot refer to an instance field wurzel while explicitly invoking an construktor."
Mit "static" läuft es einwandfrei.
Dann hast Du irgend einen dubiosen Code, bei dem Du auf eine Instanzvariable zugreifst, ee diese initialisiert werden konnte.
Und das static ist da dann vermutlich auch keine Lösung, denn damit sorgst Du nur dazu, dass die Variable halt den initialen "Null-Wert" hat. Aber dennoch wirst Du Dir sehr wahrscheinlich etwas anderes gedacht haben, als der Code effektiv machen wird.
Daher wie @temi schrieb: Zeig Deinen Code, erläutere ggf noch, was Du genau machen willst und wo Du den Fehler bekommst und dann können wir Dir weiter helfen.
Mein Code hat gar nicht viel mehr.... hier der ganze Code.
Fakt ist, dass es mit static läuft, mit final nicht und ganz ohne static und final auch nicht.
Wieso verstehe ich (noch) nicht.
Code:
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class Baum extends JTree {
private static DefaultMutableTreeNode wurzel = new DefaultMutableTreeNode("Wurzel");
public Baum() {
super(wurzel);
}
}
Code:
public class Test {
public static void main(String[] args) {
Baum baum = new Baum();
}
}
Danke !
Ich glaube ich verstehe ansatzweise was du meinst. Ursprünglich war ich sogar auf die zweite Lösung gekommen aber dachte, es wäre wohl ein Versuch wert die Klasse Tree von der Klasse JTree erben zu lassen.
Offensichtlich muss man da mit diesem static etwas vorsichtig sein...
Das mit der Wurzel im Konstruktor leuchtet mir ein. Ich war schon auf das Problem gestossen, dass ich nichts vom dem Aufruf des Konstruktors der Superklasse haben darf. Daher den Trick mit der Wurzel als Klassenvariable. Müsste diese nicht eher static sein ?
Vor allem solltest du wissen, was "static" bewirkt. Dann kannst du es auch korrekt einsetzen. Einfach mal irgendwo "static" hinzuschreiben, ist selten sinnvoll.
Natürlich, darum lernt man ja die Sprache - z.B. unter Zuhilfenahme dieses Forums. Wenn ich alles schon wüsste, wäre ich nicht hier.
Auf Static bin ich nicht einfach so gekommen, sondern weil Eclipse mir das als Lösungsweg vorgeschlagen hat.
Nun weiss ich es aber besser.