# Parent vom TransformGroup entfernen



## benoetigeHilfe (1. Jul 2010)

Morgen allerseits,

ich möchte gerne vom TransformGroup ( Child ) den Elternteil entfernen.
Also normalerweise entfernt man Objekte so: 


```
BranchGroup branch1 = new BranchGroup();
BranchGroup branchtrans = new BranchGroup();
TransformGroup transform = new TransfromGroup();

branchtrans.addChild(transform);
branch1.addChild(branchtrans);

....

branch1.removeChild(branchtrans);

branchtrans   = new BranchGroup();
branch1 = new BranchGroup();

branchtrans.addChild(transform);
branch1.addChild(branchtrans);

// Capability sind natürlich gesetzt
```

Nunja , jetzt möchte ich aber gerne den TransformGroup wieder den branchtrans als Child übergeben, nur das Problem ist das ich eine Exception bekomme , das TransformGroup schon ein Elternteil hat.
Wie kann ich den Elternteil entfernen.

So ist es nicht gewollt :  

```
transform = new TransformGroup();
```


----------



## Marco13 (1. Jul 2010)

Tut's nicht ein "detach()", wenn die entsprechenden Capabilities gesetzt sind?


----------



## benoetigeHilfe (1. Jul 2010)

Hallo Marco, 

ne leider nicht.
Für BranchGroup gibt es das entsprechende Capability setCapability(BranchGroup.ALLOW_DETACH); .

Aber bei TransformGroup gibt es leider kein setCapability(TransformGroup.ALLOW_DETACH);
Oder kann ich für TransformGroup setCapability(BranchGroup.ALLOW_DETACH); verwenden?


----------



## Marco13 (1. Jul 2010)

Oh ja, bin da ein bißchen raus. Aber wenn man 
branchGroup.removeChild(transformGroup);
macht haut's ihn auch irgendwie raus, gell? (Da war doch was...?)

Die Möglichkeit, zwischen die TransformGroup und die Eltern-BG noch eine Hilfs-Branchgroup zu klemmen, die man dann detachen kann, gibt's nicht...?


----------



## truesoul (1. Jul 2010)

Jup , leider ist es nicht möglich branchgroup.remove(transformgroup) zu machen.
Deshalb habe ich ja ein zweiten Branchgroup den ich dann branchgroup.remove(zweitenbranchgroup) ...  ( zweiterbranchgroup enthält transformgroup) so entfernen würde.
Sobald der Transformgroup ein Elternteil hat habe ich noch kein weg gefunden ihm ein neuen Elternteil zu geben ausser mit : 

```
transform = new TransformGroup();
transform.addChild(Shape3D);
```
Was aber so nicht gewollt.


----------



## Marco13 (1. Jul 2010)

Soweit ich weiß muss man da dann (falls notwendig) NOCH eine Branchgroup dazwischenklemmen :bahnhof:


----------



## benoetigeHilfe (2. Jul 2010)

So ich glaube ich sollte ein wenig mehr ausholen da es anscheinend nicht gut genug erklärt wurde von mir.

Also , ich denke ich muss jetzt nicht unbedingt die Initialiezierung vom SimpleUniverse und Co. drauf eingehen aber das wichtigeste ist:


```
BranchGroup variableBranchGroup = new BranchGroup();
variableBranchGroup.setCapability(BranchGroup.ALLOW_DETACH);

BranchGroup canvasBranchGroup = new BranchGroup();
canvasBranchGroup.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE | BranchGroup.ALLOW_CHILDREN_READ | BranchGroup.ALLOW_CHILDREN_WRITE);

// So Capability gesetzt 

public void haengeObjekteAn()
{

      for( int i = 0 ; i < objektListe.size() ; i++)
        {
            variableBranchGroup.addChild(objektListe.get(i).transformGroup);
        }


        variableBranchGroup.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
        variableBranchGroup.compile();

        canvasBranchGroup.addChild(variableBranchGroup);
        simpleUniverse.addBranchGraph(canvasBranchGroup);

}
```

So jetzt habe die Objekt geladen und ich sehe sie.
Die Variable objektListe (Typ List ) enthält ObjektInformationen wie TransformGroup, Shape3D und Co. ( Klasse ObjektInformation )

So jetzt wenn ich ein Objekt entferne muss ich :


```
public void leereBranchGroup()
    {
        // entferne Knoten

        canvasBranchGroup.removeChild(variableBranchGroup);
        // variableBranchGroup wird neu Initializiert
        
        variableBranchGroup = new BranchGroup();
        variableBranchGroup.setCapability(BranchGroup.ALLOW_DETACH);
        // canvasBranchGroup wird neu Initializiert
        canvasBranchGroup = null;
        canvasBranchGroup = new BranchGroup();
        canvasBranchGroup.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE | BranchGroup.ALLOW_CHILDREN_READ | BranchGroup.ALLOW_CHILDREN_WRITE);
    }
```

Erstmal entferne ich variableBranchGroup aus canvasBranchGroup .
Erstelle dann neue Objekte und setzte Capability.

Aus der objektListe würde ich jetzt den entsprechende ObjektInformation entfernen und die anderen behalte ich bei.
Und jetzt rufe ich wieder die Methode : 
	
	
	
	





```
haengeObjekteAn()
```

Und genau dann bekomme ich eine Exception:

Exception in thread "AWT-EventQueue-0" javax.media.j3d.MultipleParentException: Group.addChild: child already has a parent.

Diese Exception tritt in der for Schleife auf.
Obwohl ich variableBranchGroup = new BranchGroup() heißt es ja nicht das objektListe.get(i).transformGroup die Information erhält das sein Elternteil "gelöscht" wurde und somit Elternlos ist.
Aber genau das möchte ich , das ich die objektListe mit den Informationen(transformGroup) benutzen kann ohne ein Neues Objekt vom Typ Transformgroup zu erstellen.
Also im Prinzip , möchte ich das TransformGroup Elternlos wird und ich 
	
	
	
	





```
variableBranchGroup.addChild(objektListe.get(i).transformGroup);
```
 machen kann.

P.S würde ich ein neues Objekt vom Typ TransformGroup machen , würde es alles klappen aber der aufwand ist höher als nur 

```
objektListe.remove( DIESESOBJEKT );
```
P.SS Und ich hänge ja in diesem fall ein BranchGroup dazwischen.


----------



## Marco13 (2. Jul 2010)

Ob der Aufwand höher ist, als der dieses Threads sei mal dahingestellt. Man kann eine TransformGroup nicht von der BranchGroup entfenden, an der sie hängt. Mit manchen Sachen muss man sich abfinden. Und dann eben eine geeignete Alternativlösung suchen. Was dagegen spricht, dafür zu sorgen, dass man statt der Zeile

```
variableBranchGroup.addChild(objektListe.get(i).transformGroup);
```
eben

```
variableBranchGroup.addChild(objektListe.get(i).[b]eine BranchGroupWoDieTransformGroupDranhängt[/b]);
```
schreibt, weiß ich nicht.


----------



## benoetigeHilfe (2. Jul 2010)

omg , ich glaub es nicht.
Wieso komme ich nicht darauf.
Marco , ich danke dir herzlichst dafür.
Jetzt habe ich es so hinbekommen wie ich es wollte , dank dir.


----------

