# Remove Nodes



## Developer_X (27. Apr 2009)

Hi, ich habe schon seit längerem danach gegoogled
ich finde keine antwort auf die frage, wie ich ein child removen kann.
natürlich geht das im Code so:

```
a = new TransformGroup();
  a.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE|
    		  			  BranchGroup.ALLOW_CHILDREN_READ|
    		  			  BranchGroup.ALLOW_CHILDREN_WRITE|
    		  			  BranchGroup.ALLOW_DETACH);
s = new Sphere("0,null");
a.addChild(s);
```
UNd nun soll diese Methode einem button zugegebn werden:

```
a = new TransformGroup();
a.removeChild(s);
```
Ich weiß, dass die Objeckte s,und a, oben in der Klasse stehen müssen,
und dass a bestimmte capabilitys haben muss, und das man im Button nochmals erklären muss was  a ist.
Trotzdem schaffe ich es nicht, kann mir jemand ein example posten, im internet fand ichg schon zisch methoden, funktionierten alle nciht

In meinem Code wird das Objekt nicht removed


----------



## Spacerat (27. Apr 2009)

Öhö... da isser ja... der Schlag ins Gesicht...
Deswegen bin ich weg von Java3D. Hatte es schon mal in einem anderen Thread erwähnt. Die Capabilities müssen von Root bis zum tiefsten Zweig weiter gereicht werden. Der Haken: Beim SimpleUniverse hat man keinen Zugriff auf diese. Das bedeutet, das "Compiled und Live" nicht mehr veränderbar ist. Nun bleibt einem nur noch die Implementierung eines eigenen virtuellem Universe. Aber bitte: Nicht so was umständliches... Ich bin raus...
Du hoffentlich auch bald. Zumindest was Java3D angeht. Schau die endlich mal JOGL oder LWJGL an.


----------



## Developer_X (27. Apr 2009)

shock.smiley

Also das glaube ich nicht, dass Java3D so ist, das würde mir den Boden unter den Füßen wegreissen.
Ich habe in vielen Threads gelsen dass das geht, nur wie war dort nicht erklärt.

Eine Frage hätte ich da noch, wenn Java3D das nicht kann, wieso dann bitte schön
gibt es diese methode "removeChild" oder "removeAllChildren" ?
Das haben die ja nicht grundlos gemacht, das hatte ja schon einen Sinn oder?

Deshalb bin ich fest überzeugt dass das geht.

PS:
Ich wollte ja mal ein programm machen, in dem man Koordinaten von Objekten in JTextFields geben musste,
wie das geht weiß ich jetzt,

außerdem wieso gibt es bei den Capabilitys ALLOW_CHILD_WRITE wenn das nicht gehen sollte, 


also das ist wahnsinn, das muss doch gehen, sonst gäbe es nicht diese Funktion sage ich, aus reinster
Logik.


----------



## Developer_X (27. Apr 2009)

Spacerat hat gesagt.:


> Öhö... da isser ja... der Schlag ins Gesicht...
> Deswegen bin ich weg von Java3D. Hatte es schon mal in einem anderen Thread erwähnt. Die Capabilities müssen von Root bis zum tiefsten Zweig weiter gereicht werden. Der Haken: [highlight]Beim SimpleUniverse[/highlight] hat man keinen Zugriff auf diese. Das bedeutet, das "Compiled und Live" nicht mehr veränderbar ist. Nun bleibt einem nur noch die Implementierung eines eigenen virtuellem Universe. Aber bitte: Nicht so was umständliches... Ich bin raus...
> Du hoffentlich auch bald. Zumindest was Java3D angeht. Schau die endlich mal JOGL oder LWJGL an.



Ich hab die Api ja nicht voll durch gemacht, gibt es noch andere Universen, als Das SimpleUniverse
ComplexUniverse vielleicht?
oder nur Universe?
@EDIT

Hab grad nach geschaut, es gibt ne MutterKlasse von SimpleUNiverse
und eine Klasse die von SimpleUniverse erben
denkt ihr man könnte die mal versuchen, vielleicht klappts mit denen


----------



## Spacerat (27. Apr 2009)

Natürlich geht das in Java3D... Was würde Java3D denn sonst für'n Sinn haben. Das Universe heisst "VirtualUniverse", ist die oberste Abstrahierung aller Universen in Java3D und, im Gegensatz zum SimpleUniverse, alles andere als vorkonfiguriert. Diese Konfiguration muss man selber machen. Aber mir war das zu umständlich und deswegen bin ich eben da ausgestiegen. Was aufgeblähteres hab' ich im Leben noch nicht gesehen.

@Edit: Im übrigen: Bei JOGL und LWJGL hat man ein viel weiter gefächertes Angebot an Tutorials, was aus der Tatsache hervorgeht, das beides auf OpenGL basiert und nicht blos Java als Grundlage hat. Und wenn du ernsthaft erwägst mit einem von beiden neu zu beginnen, nimm die Java-Grundlagen auch gleich mit.


----------



## Marco13 (27. Apr 2009)

Um's nochmal zu betonen: Java3D und JOGL haben erstmal vom Ansatz her NICHTS miteinander zu tun. Java3D ist eine Szenegraph-API, und JOGL ist kaum mehr als OGL. Also, wenn man damit eine "komplexere" Anwendung schreiben will, wird man auch nicht um irgendeine Form von Szenenverwaltung drumrumkommen (d.h. man würde dann einen eigenen Szenegraphen schreiben :autsch: und da natürlich alles viiiieeel besser machen, als die Deppen das bei Java3D gemacht haben  )

Zur eigentlichen Frage:
a = new TransformGroup();
a.removeChild(s);

Wenn du da eine neue TransformGroup erstellst, gibt's nichts, was da removt werden könnte....


----------



## Spacerat (27. Apr 2009)

Marco13 hat gesagt.:


> Um's nochmal zu betonen: Java3D und JOGL haben erstmal vom Ansatz her NICHTS miteinander zu tun. Java3D ist eine Szenegraph-API, und JOGL ist kaum mehr als OGL. Also, wenn man damit eine "komplexere" Anwendung schreiben will, wird man auch nicht um irgendeine Form von Szenenverwaltung drumrumkommen (d.h. man würde dann einen eigenen Szenegraphen schreiben :autsch: und da natürlich alles viiiieeel besser machen, als die Deppen das bei Java3D gemacht haben  )


100%ige Zustimmung.





Marco13 hat gesagt.:


> Zur eigentlichen Frage:
> a = new TransformGroup();
> a.removeChild(s);
> 
> Wenn du da eine neue TransformGroup erstellst, gibt's nichts, was da removt werden könnte....


Ja, nee... is' klar. Bin mal davon ausgegangen, das da noch einiges zwischen kommt, da es ja ein KSKB sein sollte.


----------



## Illuvatar (27. Apr 2009)

Spacerat hat gesagt.:


> Die Capabilities müssen von Root bis zum tiefsten Zweig weiter gereicht werden. Der Haken: Beim SimpleUniverse hat man keinen Zugriff auf diese. Das bedeutet, das "Compiled und Live" nicht mehr veränderbar ist. Nun bleibt einem nur noch die Implementierung eines eigenen virtuellem Universe.



Ich versteh grad nicht ganz was du meinst ???:L Natürlich ist etwas was compiled / live ist, nicht veränderbar - das wird man afaik auch mit anderer VirtualUniverse-Implementierung nicht anders hinkriegen. Aber was hindert einen daran, die nötigen Capabilities zu setzen, bevor etwas live gemacht wird?
Und "von Root bis zum tiefsten Zweig weiter gereicht werden" - was meinst du damit? Jeder Node genau kriegt die Capabilities, die er braucht.



> Ja, nee... is' klar. Bin mal davon ausgegangen, das da noch einiges zwischen kommt, da es ja ein KSKB sein sollte.



Sagen wir mal... so wie ich den TS kenne, besteht eine gute Chance dass Marco13 Recht hat.


----------



## Spacerat (27. Apr 2009)

So wie ich den TS kenne besteht eine gute Chance, das Marco13 Recht hat... korrekt.
So wie es aber für mich aussieht ist DX gerade an dem Punkt wo ich bei Java3D ausgestiegen bin.
Soweit ich das verstanden habe, kann ein Zweig des Szenegraphen nur dann verändert werden, wenn alle Mutterelemente ebenso veränderlich sind. Die Caps beziehen sich ja auf "LIVE_AND_COMPILED". Das Problem was ich damals beim Simpleuniverse hatte, ich konnte dort beim ROOT-Knoten diese Caps nicht setzen, weil ich darauf gar nicht zugreifen konnte (Hab' das damals auch irgendwo nach gelesen). Fazit war, dass, wenn man ein dynamisches Universe, wie für 3D-Games üblich, haben wollte musste man selbst ein VirtualUniverse bauen. Ein einfacher Anwendungsfall wäre z.B. ein durch Beschuss zerstörtes Objekt in der Liveszene durch eine Explosion zu ersetzen.


----------



## Marco13 (27. Apr 2009)

Hmnee, also, ich bin mir ziemlich sicher, dass wenn man zwei Referenzen A und B hat, und B ein Kind von A ist, und in A die passenden Bits gesetzt sind, man ohne Probleme B von A entfernen kann - egal, WO genau im (ansonsten vielleicht unveränderlichen) Szenegraphen A und B liegen...


----------



## Developer_X (28. Apr 2009)

ihr habt irgendwie alle gesagt, dass es geht, nur sehr viel Arbeit ist.

Hier mal ein kleines KSKB das eure Hilfe braucht, (dies soll kein richtiges Programm sein) nur um einen Node zu removen

```
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

@SuppressWarnings("serial")
public class KSKB extends JFrame
{
	public static TransformGroup Parent;
	public static Sphere s;
	public KSKB()
	{
		this.setTitle("KSKB=.Kleines.Selbständiges.Kompilirbares.Beispiel.");
		this.setSize(400,400);
		this.setVisible(true);
        this.setLayout(null);

		//Components
		//3D World Configuration
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        canvas.setBounds(0,20,400,380);
        SimpleUniverse universe = new SimpleUniverse(canvas);       
        universe.addBranchGraph(Universe());
        //Special Button
        JButton b = new JButton("Child_Button");
b.setBounds(0,0,400,20);
        b.addActionListener( new ActionListener() 
{
public void actionPerformed(ActionEvent evt) 
{b1ActionPerformed(evt);}private void b1ActionPerformed(ActionEvent evt)
	     {  	 
	    	Parent.removeChild(s);
	     }});
        //adds
        this.add(b);
        this.add(canvas);       
        //Last Things to do
     		this.setVisible(true);
this.setLayout(null);

	}
	public static BranchGroup Universe()
    {
    final BranchGroup X= new BranchGroup();       
    //Universe
   
    //Here
    Transform3D a = new Transform3D();
    a.setTranslation(new Vector3f(0,0,-5));
    Parent = new TransformGroup();
    Parent.setTransform(a);
    Parent.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE|
            BranchGroup.ALLOW_CHILDREN_READ|
            BranchGroup.ALLOW_CHILDREN_WRITE|
            BranchGroup.ALLOW_DETACH);
    s = new Sphere(1,null);
    X.addChild(Parent);
  
    //Directional Light
    Color3f lightColor = new Color3f(.6f,.6f,.6f);
    AmbientLight ambientLight= new AmbientLight(lightColor);
    ambientLight.setInfluencingBounds(new BoundingSphere());
    X.addChild(ambientLight);
    DirectionalLight directionalLight = new DirectionalLight();
    directionalLight.setColor(lightColor);
    directionalLight.setInfluencingBounds(new BoundingSphere());
    X.addChild(directionalLight);     
    return X;       
}       
	public static void main(String[]args)
	{
		new KSKB();
	}
	  
}
```
@EDIT:jetzt funktionierts!


----------



## Developer_X (30. Apr 2009)

einer von euch muss doch eine antwort haben oder? :|


----------



## Marco13 (30. Apr 2009)

Wenn man die Frage kennt..................?!


----------



## Developer_X (30. Apr 2009)

die frage ist, wie kann man nodes removen, oben siehst du ein KSKB so, das sollst du so ändern dass es nodes removed


----------



## Jango (30. Apr 2009)

developer_x hat gesagt.:


> die frage ist, wie kann man nodes removen, oben siehst du ein kskb so, das sollst du so ändern dass es nodes removed



...



developer_x hat gesagt.:


> @edit:jetzt funktionierts!





Developer_X hat gesagt.:


> oben siehst du ein KSKB so, *das sollst du so ändern* dass es nodes removed




Hier *soll* jemand was für dich tun? Früher warst du freundlicher, da hast du gebettelt - jetzt dauerts dir zu lang, wa? Da muss schonmal ein richtig-männlicher Befehlston her...
Soviel kranke Materie muss man erstmal verdauen.


----------



## Developer_X (1. Mai 2009)

Ich meinte dass das KSKB funktioniert, ohne das was wir suchen. Also, nun ist unser problem, wieso der Sphere nicht removed wird.

PS:
Sorry an alle
die das missverstanden
haben


----------



## Illuvatar (1. Mai 2009)

Lies mal die Fehlermeldung, die ist eigentlich sehr unmissverständlich.

(Außerdem wird in deinem KSKB die Sphere nicht mal den SceneGraph hinzugefügt)


----------



## Developer_X (1. Mai 2009)

ah ich sees, die Fehlermeldung sagt was?

```
Group: only a BranchGroup node may be removed
```
Also was heißt das für uns?
Meine Theorien:
1.Man muss eine zweite Branchgroup erstellen, die PARENT added, und X muss diese adden, und kann sie dann auch removen
2.man muss oben bei der Componential Initialisierung von der Graphics Configuration usw.. diese BRanchgroup removen


----------



## Developer_X (1. Mai 2009)

ich habs geordered, erst der Code, dann die Fehlermeldung

```
@SuppressWarnings("serial")
public class KSKB extends JFrame
{
    public static BranchGroup A;
    public static BranchGroup X;
    public KSKB()
    {
        this.setTitle("KSKB=.Kleines.Selbständiges.Kompilirbares.Beispiel.");
        this.setSize(400,400);
        this.setVisible(true);
        this.setLayout(null);
 
        //Components
        //3D World Configuration
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        canvas.setBounds(0,20,400,380);
        SimpleUniverse universe = new SimpleUniverse(canvas);       
        universe.addBranchGraph(Universe());
        //Special Button
        JButton b = new JButton("Child_Button");
b.setBounds(0,0,400,20);
        b.addActionListener( new ActionListener() 
{
public void actionPerformed(ActionEvent evt) 
{b1ActionPerformed(evt);}private void b1ActionPerformed(ActionEvent evt)
         {      
	 X.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE|
	            BranchGroup.ALLOW_CHILDREN_READ|
	            BranchGroup.ALLOW_CHILDREN_WRITE|
	            BranchGroup.ALLOW_DETACH);
X.removeChild(A);
}});
        //adds
        this.add(b);
        this.add(canvas);       
        //Last Things to do
            this.setVisible(true);
this.setLayout(null);
 
    }
    public static BranchGroup Universe()
    {
    X= new BranchGroup();       
    //Universe
    X.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE|
            BranchGroup.ALLOW_CHILDREN_READ|
            BranchGroup.ALLOW_CHILDREN_WRITE|
            BranchGroup.ALLOW_DETACH);
    A = new BranchGroup();
    X.addChild(A);
    //Here
    Transform3D a = new Transform3D();
    a.setTranslation(new Vector3f(0,0,-5));
    TransformGroup Parent = new TransformGroup();
    Parent.setTransform(a);
   
    Sphere s = new Sphere(1,null);
    Parent.addChild(s);
    A.addChild(Parent);
  
    //Directional Light
    Color3f lightColor = new Color3f(.6f,.6f,.6f);
    AmbientLight ambientLight= new AmbientLight(lightColor);
    ambientLight.setInfluencingBounds(new BoundingSphere());
    X.addChild(ambientLight);
    DirectionalLight directionalLight = new DirectionalLight();
    directionalLight.setColor(lightColor);
    directionalLight.setInfluencingBounds(new BoundingSphere());
    X.addChild(directionalLight);   
    X.compile();
    return X;       
}       
    public static void main(String[]args)
    {
        new KSKB();
    }
```



```
Exception in thread "AWT-EventQueue-0" javax.media.j3d.RestrictedAccessException: Cannot modify capability bits on a live or compiled object
	at javax.media.j3d.SceneGraphObject.setCapability(SceneGraphObject.java:150)
	at Start.KSKB$1.b1ActionPerformed(KSKB.java:47)
	at Start.KSKB$1.actionPerformed(KSKB.java:45)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

hier ist wieder der Punkt mit dem Live Compiled Object

Die Zeile X.compile(); hab ich etwas später hinzugefügt, also das hier ist alle das aktuellste von unserem Code


----------



## Illuvatar (1. Mai 2009)

Wofür sollen denn Zeilen 28 bis 31 bitte gut sein?
- Entferne die, die sind Unsinn
- Zeile 48 ist auch Unsinn. Nicht unbedingt falsch, aber sie macht überhaupt nichts - man kann Capabilities nur enmal setzen.
- (Zeile 49) ALLOW_DETACH brauchst du hier nicht, weil die BranchGroup ja anscheinend nicht detached werden soll
- Nach Zeile 50 müsstest du aber auf A noch das ALLOW_DETACH-Bit setzen.
- Außerdem wollte nich noch anmerken, dass Zeilen 10 und 39 auch ziemlicher Quark sind, und dass außerdem ein BorderLayout um einiges besser als ein null-Layout wäre.
- Und dass Strg-Shift-F die Lesbarkeit um geschätzt 420% erhöhen würde
- Und das ganze Zeug von wegen Grundlagen lernen und Code nicht nur zusammenkopieren... naja das kennst du ja schon


----------



## Developer_X (1. Mai 2009)

Illuvatar hat gesagt.:


> Wofür sollen denn Zeilen 28 bis 31 bitte gut sein?
> - Entferne die, die sind Unsinn
> - Zeile 48 ist auch Unsinn. Nicht unbedingt falsch, aber sie macht überhaupt nichts - man kann Capabilities nur enmal setzen.
> - (Zeile 49) ALLOW_DETACH brauchst du hier nicht, weil die BranchGroup ja anscheinend nicht detached werden soll
> ...



ferrtig:

```
package Start;

import java.awt.GraphicsConfiguration;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

@SuppressWarnings("serial")
public class KSKB extends JFrame {
	public static BranchGroup A;
	public static BranchGroup X;

	public KSKB() {
		this.setTitle("KSKB=.Kleines.Selbständiges.Kompilirbares.Beispiel.");
		this.setSize(400, 400);
		this.setVisible(true);
		this.setLayout(null);

		// Components
		// 3D World Configuration
		GraphicsConfiguration config = SimpleUniverse
				.getPreferredConfiguration();
		Canvas3D canvas = new Canvas3D(config);
		canvas.setBounds(0, 20, 400, 380);
		SimpleUniverse universe = new SimpleUniverse(canvas);
		universe.addBranchGraph(Universe());
		// Special Button
		JButton b = new JButton("Child_Button");
		b.setBounds(0, 0, 400, 20);
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				b1ActionPerformed(evt);
			}

			private void b1ActionPerformed(ActionEvent evt) {
				

				X.removeChild(A);
			}
		});
		// adds
		this.add(b);
		this.add(canvas);
		// Last Things to do
		this.setVisible(true);
		this.setLayout(null);

	}

	public static BranchGroup Universe() {
		X = new BranchGroup();
		// Universe
		X.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE
				| BranchGroup.ALLOW_CHILDREN_READ
				| BranchGroup.ALLOW_CHILDREN_WRITE );
		A = new BranchGroup();
		X.addChild(A);
		A.setCapability(BranchGroup.ALLOW_DETACH);
		// Here
		Transform3D a = new Transform3D();
		a.setTranslation(new Vector3f(0, 0, -5));
		TransformGroup Parent = new TransformGroup();
		Parent.setTransform(a);

		Sphere s = new Sphere(1, null);
		Parent.addChild(s);
		A.addChild(Parent);

		// Directional Light
		 Color3f light1Color = new Color3f(1.9f, 0.13f, 160000.6f);

		   BoundingSphere bounds = 

		   new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

		   Vector3f light1Direction = new Vector3f(1.0f, -7.0f, -12.0f);

		   DirectionalLight light2

		      = new DirectionalLight(light1Color, light1Direction);

		   light2.setInfluencingBounds(bounds);

		   X.addChild(light2);
		   
		X.compile();
		return X;
	}

	public static void main(String[] args) {
		new KSKB();
	}

}
```
1.Das null layout hab ich halt gelassen,
2.ich setzte die Capabilities mehrmal, weil das halt so ist, weil die Fehlermeldung das von mir verlangt
3.sonstiges habe ich fertig, ich habe auch STRG+SHIFT+F gemacht
4.den Code habe ich komplett selbst geschrieben, dass ist kein spaß mehr, ich meins ernst. 

Aber jetzt funktionierts !


----------



## Developer_X (1. Mai 2009)

aber nun schau mal auf die roten stellen, mich würde interessieren, why ich den Sphere nicht mehr adden kann, schau doch bitte noch mal. Das würde mir eine meiner Hauptfragen in Java3D Beantworten:

```
package Start;

import java.awt.GraphicsConfiguration;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

@SuppressWarnings("serial")
public class KSKB extends JFrame {
	public static BranchGroup A;
	public static BranchGroup X;

	public KSKB() {
		this.setTitle("KSKB=.Kleines.Selbständiges.Kompilirbares.Beispiel.");
		this.setSize(400, 400);
		this.setVisible(true);
		this.setLayout(null);

		// Components
		// 3D World Configuration
		GraphicsConfiguration config = SimpleUniverse
				.getPreferredConfiguration();
		Canvas3D canvas = new Canvas3D(config);
		canvas.setBounds(0, 20, 400, 380);
		SimpleUniverse universe = new SimpleUniverse(canvas);
		universe.addBranchGraph(Universe());
		// Special Button
		JButton b = new JButton("Child_Button");
		b.setBounds(0, 0, 400, 20);
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				b1ActionPerformed(evt);
			}

			private void b1ActionPerformed(ActionEvent evt) {
				[highlight]

				if(X == A.getParent())
				{
					X.removeChild(A);

				}
				else
				{
					X.addChild(A);

				}
[/highlight]
			}
		});
		// adds
		this.add(b);
		this.add(canvas);
		// Last Things to do
		this.setVisible(true);
		this.setLayout(null);

	}

	public static BranchGroup Universe() {
		X = new BranchGroup();
		// Universe
		X.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE
				| BranchGroup.ALLOW_CHILDREN_READ
				| BranchGroup.ALLOW_CHILDREN_WRITE );
		A = new BranchGroup();
		X.addChild(A);
		A.setCapability(BranchGroup.ALLOW_DETACH);
		// Here
		Transform3D a = new Transform3D();
		a.setTranslation(new Vector3f(0, 0, -5));
		TransformGroup Parent = new TransformGroup();
		Parent.setTransform(a);

		Sphere s = new Sphere(1, null);
		Parent.addChild(s);
		A.addChild(Parent);

		// Directional Light
		 Color3f light1Color = new Color3f(1.9f, 0.13f, 160000.6f);

		   BoundingSphere bounds = 

		   new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

		   Vector3f light1Direction = new Vector3f(1.0f, -7.0f, -12.0f);

		   DirectionalLight light2

		      = new DirectionalLight(light1Color, light1Direction);

		   light2.setInfluencingBounds(bounds);

		   X.addChild(light2);
		   
		X.compile();
		return X;
	}

	public static void main(String[] args) {
		new KSKB();
	}

}
```


----------



## Illuvatar (1. Mai 2009)

Developer_X hat gesagt.:


> 4.den Code habe ich komplett selbst geschrieben, dass ist kein spaß mehr, ich meins ernst.


Ok glaub ich dir

Zu deinem Problem: Die Sache ist die, dass man nicht mehrere Capabilities auf einmal setzen kann. Das hatte ich auch schon wieder vergessen - ist nachzulesen in der API. Außerdem brauchst du noch die Capability ALLOW_CHILDREN_EXTEND, wenn du ein child hinzufügen willst.
Also musst du das auf X machen:

```
X.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
    X.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
```
Mehr als die beiden brauchst du nicht.


----------



## Developer_X (1. Mai 2009)

thanks 

Danke man, das waren eine meine letzten Fragen


----------

