JTree, Knoten mehrmals verwenden

The_God

Aktives Mitglied
Hallo Leute,

ich möchte einen Knoten mehrmals in einem JTree verwenden (keine neue Instanz)


B
|..C
|.....A
D
| ... A
E
|.....A

Problem ist nun das "A" nur unter "E" angezeigt wird. Erzeuge ich "A" jedoch jeweils neu dann funktioniert es. A möchte ich aber nur eine Instanz haben da Db-Zugriff.

Nachfolgend der Quellcode

Projektliste welche Knoten C,D,E ... erzeugt
Code:
package myjobadmin.MyProjects;

import myjobadmin.MyDatabase.*;
import java.sql.ResultSet;
import myjobadmin.MyProjects.*;
import java.util.Vector;
import javax.swing.tree.DefaultMutableTreeNode;
import myjobadmin.MyAssemblies.MyMainAssemblyList;
import myjobadmin.MyOutprint;


public class MyProjectList {
  private MyDatabase mdb;
  private Vector data;
  private DefaultMutableTreeNode root;
  private MyMainAssemblyList mainAssList;

  /* Konstruktor (ohne BG) */
  public MyProjectList(MyDatabase _mdb) {
    MyOutprint.print(0, this, "Konstruktor ohne BG wird gestartet");
    this.mdb = _mdb;

    this.root = new DefaultMutableTreeNode("Projekte");

    this.mainAssList = null;

    this.init();
  }

  /* Konstruktor (mit BG)*/
  public MyProjectList(MyDatabase _mdb, MyMainAssemblyList _mainAssList) {
    MyOutprint.print(0, this, "Konstruktor mit BG wird gestartet");
    this.mdb = _mdb;

    this.root = new DefaultMutableTreeNode("Projekte");

    this.mainAssList = _mainAssList;

    this.init();
  }

  /* Initialisierung */
  private void init(){
    try{
      // hier Aktualität prüfen

      this.readProjectsFromDb();
    }catch(Exception e_init){

    }
  }

  /* Projekte aus Datenbank auslesen */
  private void readProjectsFromDb() throws Exception{
    MyOutprint.print(1, this, "readProjectsFromDb() wird gestartet ...");

    String strSQL = "SELECT * FROM myprojectlist ORDER BY Projektnummer ASC";

    ResultSet rstData = mdb.executeQueryRST(strSQL);

    // Spalten
    int cols = rstData.getMetaData().getColumnCount();
    String[] columnNames = new String[cols];
    for(int i=0; i<cols; i++) columnNames[i] = rstData.getMetaData().getColumnName(i+1);

    // Daten (sortiert nach Projektnummer)
    this.data = new Vector();
    int projectNumber;
    Object data[];;
    rstData.beforeFirst();
    int c=0;

    while(rstData.next()){
      projectNumber = rstData.getInt("Projektnummer");
      data = new Object[cols];
      for(int j=0; j<cols; j++){
        data[j] = rstData.getObject(j+1);
      }

      if( this.mainAssList != null ){
        this.data.add(new MyProject(projectNumber, columnNames, data, this.mainAssList) );
      } else
        this.data.add(new MyProject(projectNumber, columnNames, data) );

      // Zu Knoten hinzufügen
      this.root.add( ((MyProject)this.data.get(c)).getNode() );
      c++;
    }
  }

  /* Knoten */
  public DefaultMutableTreeNode getNode(){
    return this.root;
  }
}

Code für die jeweiligen Knoten C,D,E hier wird A als Child element eingefügt
Code:
package myjobadmin.MyProjects;

import myjobadmin.MyOutprint;
import javax.swing.tree.DefaultMutableTreeNode;
import myjobadmin.MyAssemblies.*;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2011</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class MyProject {
  private Object[] propertyValues;
  private String[] propertyNames;
  private int projectNumber;
  private DefaultMutableTreeNode node;
  private MyMainAssemblyList mainAssList;
  private DefaultMutableTreeNode nodeChild;

  /* Konstruktor */
  public MyProject(int _projectNumber, String[] _propertyNames, Object[] _propertyValues) {
    this.propertyNames = _propertyNames;
    this.propertyValues = _propertyValues;
    this.projectNumber = _projectNumber;

    // Baugruppen (hier keine)
    this.mainAssList = null;

    this.node = new DefaultMutableTreeNode(this);
  }

  /* Konstruktor */
  public MyProject(int _projectNumber, String[] _propertyNames, Object[] _propertyValues, MyMainAssemblyList _mainAssList) {
    this.propertyNames = _propertyNames;
    this.propertyValues = _propertyValues;
    this.projectNumber = _projectNumber;

    // Baugruppen
    this.mainAssList = _mainAssList;

    this.node = new DefaultMutableTreeNode(this);
    this.node.add( this.mainAssList.getTree() );
  }

  /* Projektnummer */
  public int getProjectNumber(){
    return this.projectNumber;
  }

  /* Eigenschaft */
  public Object getPropValue(String _propertyName){
    MyOutprint.print(1, this, "getPropValue() für \""+_propertyName+"\" wird gestartet ...");
    for(int i=0; i<this.propertyNames.length; i++)
      if(propertyNames[i].equals(_propertyName)) return this.propertyValues[i];
    return null;
  }

  /* Knoten */
  public DefaultMutableTreeNode getNode(){
    return this.node;
  }
}

Hat jemand eine Idee warum "A" nur immer an der letzten Position angezeigt wird und was ich anstellen muss ohne jedesmal "A" neu zu erzeugen.

Danke schon mal
 
Ich befürchte, so wie du das machst funktioniert das garnicht. Wenn du zu einer DefaultMutableTreeNode eine Childnode addest, dann entfernt sie diese Childnode automatisch aus allen anderen Nodes in denen sie evt. schon vertreten ist.
Allerdings seh ich auch kein Problem damit für jeden Baumeintrag eine neue TreeNode zu erstellen. Du kannst ja für jede die selbe Instanz von MyProjekt verwenden, damit hast du die Identität des eigentlichen Modellobjektes gewahrt und dein Problem gelöst 🙂
 
Grundsätzlich ist Dein Klassenaufbau etwas merkwürdig und für mich aktuell noch schwer durchschaubar. Warum gibt ein MyProject Objekt einen TreeNode zurück und MyMainAssemblyList kann sogar einen kompletten JTree zurückgeben?
Grundsätzlich sollte man Daten und Darstellung bzw. das Darstellungmodell trennen. Auf der einen Seite baut man (bei Bedarf) ein sauberes Datenmodell auf, auf der anderen Seite baut man (auf dem Datenmodell) die Darstellung auf. Hier scheint mir einiges durchmischt zu sein.
Außerdem sehr unschön: globale und lokale Variablen mit dem selben Namen
Code:
data
bei denen es sich zusätzlich auch noch um unterschiedliche Typen handelt.
 

Zurück
Oben