# Java3D Objekte entfernen und hinzufügen



## Mirkko (8. Jan 2010)

Hallo Zusammen,
Vorweg:
Ich bin relativ neu in der Java-Programmierwelt und erst in Tuchfühlung mit Java3D. Ich hoffe, dennoch, dass mein BeispielCode-Lesbar ist (Mühe hab ich mir jedenfalls gegeben)
Danke für Euer Verständnis und Hilfeleistungen.

Was hab ich vor:
Ich hab ein GUI erstellt mit 3 Buttons, je nach dem welchen ich verwende, soll in der Scene ein Kreis, ein Kubus oder ein Cylinder erscheinen.

Mein Problem:
Also die 3 Buttons erstellen klappt, eine Scene mit einem Start-Objekt klappt auch.
Doch klappt es nun nicht, dieses Start-Objekt wieder zu löschen und durch ein neues zu ersetzen.
Meine Variante ergibt die Fehlermeldung: 
Exception in thread "AWT-EventQueue-0" javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be removed at javax.media.j3d.Group.removeAllChildren(Group.java:403)
ich erkenne daraus, dass ich die removeAllChildren nicht verwenden darf, aber weiter komme ich nicht:-(

Frage an die "Profis":
hab ich einen vollständig falschen Ansatz gewählt? 
Wie kann ich das Problem lösen?

Hab mich durch dieses und andere Foren durchgelesen aber bin auf keinen grünen Zweig gekommen...

Vielen Dank für Euer Hilfe.



```
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import javax.media.j3d.*;
import javax.swing.JFrame;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
	
    static TransformGroup objTrans = new TransformGroup();
    
    
    public static void main(String args[]) {
    	JFrame fenster = new JFrame ("Java3D");
 		fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         
   //////Beginn GUI 
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
        
         JPanel panel= new JPanel();
         Button aButton = new Button("Kreis");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Cylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
			drawingPanel.add("North",panel);
			
			aButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Quader();
				        }
				      }
				    );

				    bButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Kugel();
				        }
				      }
				    );

				    cButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Cylinder();
					    }
				      }
				    );
//////Ende GUI
			
	///Beginn Universum erstellen			
					GraphicsConfiguration config =
			    	    SimpleUniverse.getPreferredConfiguration();
					Canvas3D c = new Canvas3D(config);
					SimpleUniverse univ = null;
			  	    univ = new SimpleUniverse(c);
		    	  	  univ.getViewingPlatform().setNominalViewingTransform();
	     		  	univ.getViewer().getView().setMinimumFrameCycleTime(5);
			        
			    	drawingPanel.add("Center",c);
			    	objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	BranchGroup objRoot = new BranchGroup();
			    	objRoot.addChild(objTrans);
			    	
			    	//Aufruf eines Objektes
			    	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
		        	Aufrufen.Quader();
				    	
			            // Have Java 3D perform optimizations on this scene graph.
			            objRoot.compile();
			            univ.addBranchGraph(objRoot);
			            		            
		    	fenster.pack();
            }
    
    public void Loeschen(){  //Objekte Löschen
    	objTrans.removeAllChildren();
    	}
    
    public void Quader(){
    	objTrans.addChild(new ColorCube(0.1));  	
    }
    
    public void Kugel(){
    	objTrans.addChild(new ColorCube(1));  	
    }
    
    public void Cylinder(){
     	Appearance app = new Appearance();
    	app.setColoringAttributes(new ColoringAttributes (1,0,1,0));
    	Cylinder colorcube1=new Cylinder((float)12,5, app);	 
    	objTrans.addChild(colorcube1);  
   
    }
}
```


----------



## Marco13 (8. Jan 2010)

Bin ein bißchen raus aus Java3D, aber zum Entfernen muss man Grundsätzlich die Capability-Bits setzen... in diesem fall: Bei dem Knoten, wo Children entfernt und hinzugefügt werden sollen, muss ALLOW_CHILDREN_WRITE gesetzt sein.

Ob man zwischen den TransformGroup und den ColorCube jetzt (wie es die Meldung suggeriert) wirklich eine Brachgroup schalten muss...

```
BranchrGroup bg = new BranchGroup()
bg.addChild(new ColorCube(0.1));
objTrans.addChild(bg);
```
weiß ich grad' nicht auswendig ???:L müßtest du mal ausprobieren - WENN, dann müßte in dieser BranchGroup aber wohl auch das ALLOW_DETACH Capability bit gesetzt sein.


----------



## Mirkko (9. Jan 2010)

Hallo Marco
danke für Deinen Tipp,
doch irgendwie funktioniert das dennoch nicht bei mir.
Hab ich richtig verstanden, 
ich füge nach Zeile 82 ein:

```
objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE)
```

und in 102:

```
BranchrGroup bg = new BranchGroup()
bg.addChild(new ColorCube(0.1));
objTrans.addChild(bg);
```

Die Sache mit ALLOW_DETACH bei der Capability konnte ich nicht finden.

Oder hab ich Deinen Tipp falsch verstanden?

Vielen Dank für Deine Bemühungen.


----------



## Marco13 (9. Jan 2010)

BranchGroup (Java 3D 1.3.2)

Müßte dann eigentlich

```
BranchrGroup bg = new BranchGroup()
[b]bg.setCapability(BranchGroup.ALLOW_DETACH);[/b]
bg.addChild(new ColorCube(0.1));
objTrans.addChild(bg);
```
sein ... wenn nicht, muss ich's mal testen...


----------



## Mirkko (9. Jan 2010)

Hallo Marco,
Grosses Danke, also einen Schritt weiter bin ich nun schon mal 

mit der Modifikation klappt es nun das erste Objekt zu löschen,
jedoch kann ich dann kein weiters mehr hinzufügen.
es kommt erneut die Fehlermeldung:
"Group: no capability to append children"
Und der Verweis auf Zeile 109.

Hmm ich bin mir sicher, dass es noch ein kleines Etwas ist, das fehlt, aber sehe es echt nicht alleine. Tut mir leid. Evtl. siehst es Du auf anhieb... Wäre dir sehr dankbar.

Vielen Dank für Dein Engagement

Anbei nochmals der Code wie er im Moment aussieht

```
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
	
    static TransformGroup objTrans = new TransformGroup();
    
    
    public static void main(String args[]) {
    	JFrame fenster = new JFrame ("Java3D");
 		fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         
   //////Beginn GUI 
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
        
         JPanel panel= new JPanel();
         Button aButton = new Button("Kreis");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
			drawingPanel.add("North",panel);
			
			aButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Quader();
				        }
				      }
				    );

				    bButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Kugel();
				        }
				      }
				    );

				    cButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Cylinder();
					    }
				      }
				    );
//////Ende GUI
			
	///Beginn Universum erstellen			
					GraphicsConfiguration config =
			    	    SimpleUniverse.getPreferredConfiguration();
					Canvas3D c = new Canvas3D(config);
					SimpleUniverse univ = null;
			  	    univ = new SimpleUniverse(c);
		    	  	  univ.getViewingPlatform().setNominalViewingTransform();
	     		  	univ.getViewer().getView().setMinimumFrameCycleTime(5);
			        
			    	drawingPanel.add("Center",c);
			    	objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
			    	BranchGroup objRoot = new BranchGroup();
			    	//objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objRoot.addChild(objTrans);
			    	
			    	//Aufruf eines Objektes
			    	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
		        	Aufrufen.Quader();
				    	
			            // Have Java 3D perform optimizations on this scene graph.
			            objRoot.compile();
			            univ.addBranchGraph(objRoot);
			            		            
		    	fenster.pack();
            }
    
    public void Loeschen(){  //Objekte Löschen
    	objTrans.removeAllChildren();
    	}
    
    public void Quader(){
    	//objTrans.addChild(new ColorCube(0.1));  
    	BranchGroup bg = new BranchGroup();
    	bg.setCapability(BranchGroup.ALLOW_DETACH);
    	bg.addChild(new ColorCube(0.1));
    	objTrans.addChild(bg);
    }
    
    public void Kugel(){
    	objTrans.addChild(new Sphere(1));  	
    }
    
    public void Cylinder(){
     	Appearance app = new Appearance();
    	app.setColoringAttributes(new ColoringAttributes (1,0,1,0));
    	Cylinder colorcube1=new Cylinder((float)12,5, app);	 
    	objTrans.addChild(colorcube1);  
   
    }
}
```


----------



## Marco13 (10. Jan 2010)

Immernoch ungetestet... : Die objTrans braucht wohl auch noch ALLOW_CHILDREN_EXTEND ...


----------



## Mirkko (10. Jan 2010)

Hallo Marco
Grosses DANKE. Ich bin beeindruckt!

Mit deinem Tipp bin ich einen weiteren Schritt weiter. Nun fehlt nur noch einer und dann kann ich hier das fertige Beispiel posten (und wieder ruhig schlafen).

mit ALLOW_CHILDREN_EXTEND nach Zeile 84, 
klappt es nun das erste objekt wieder zu entfernen und wieder zu entfernen. :applaus:

Auch kann ich den Würfel wieder einfügen das klappt auch ganz schön. :applaus:

;( Was jedoch immer noch nicht klappt ist ein anderes Objekt einzufügen. Also zum Beispiel einen Zylinder oder die Kugel. 

Ich hab erneut ausprobiert auch mit den was ich bis jetzt gelern hab von Deinen anderen Tipps, doch blicke ich nicht durch... hast du noch einen letzten Tipp? wäre mega toll.

Ein enorm grosses DANKE für die bis jetzt geleistete Arbeit.


----------



## Marco13 (10. Jan 2010)

Häm... diese zusätzliche BranchGroup braucht man natürlich nicht nur beim ColorCube, sondern auch bei den anderen beiden Objekttypen....


----------



## Mirkko (10. Jan 2010)

Hallo Marco
yep, das hab ich mir gedacht.  aber eben das ging auch nicht, oder hab ich wieder etwas falsch gemacht.. also irgend etwas ist falsch, sonst würde es ja gehen, dass die anderen objekte auch angezeigt werden

immerhin gibt es keine fehlermeldung kleiner trost

anbei nochmals den code so wie ich ihn jetzt hab, evtl. kannst du kurz drauf schauen, wenn du noch lust hast. 
En Gruess


```
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
	
    static TransformGroup objTrans = new TransformGroup();
    
    
    public static void main(String args[]) {
    	JFrame fenster = new JFrame ("Java3D");
 		fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         
   //////Beginn GUI 
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
        
         JPanel panel= new JPanel();
         Button aButton = new Button("Würfel");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
			drawingPanel.add("North",panel);
			
			aButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Wuerfel();
				        }
				      }
				    );

				    bButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Kugel();
				        }
				      }
				    );

				    cButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Cylinder();
					    }
				      }
				    );
//////Ende GUI
			
	///Beginn Universum erstellen			
					GraphicsConfiguration config =
			    	    SimpleUniverse.getPreferredConfiguration();
					Canvas3D c = new Canvas3D(config);
					SimpleUniverse univ = null;
			  	    univ = new SimpleUniverse(c);
		    	  	  univ.getViewingPlatform().setNominalViewingTransform();
	     		  	univ.getViewer().getView().setMinimumFrameCycleTime(5);
			        
			    	drawingPanel.add("Center",c);
			    	objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
			    	objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
			    	BranchGroup objRoot = new BranchGroup();
			    	//objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objRoot.addChild(objTrans);
			    	
			    	//Aufruf eines Objektes
			    	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
		        	Aufrufen.Wuerfel();
				    	
			            // Have Java 3D perform optimizations on this scene graph.
			            objRoot.compile();
			            univ.addBranchGraph(objRoot);
			            		            
		    	fenster.pack();
            }
    
    public void Loeschen(){  //Objekte Löschen
    	objTrans.removeAllChildren();
    	}
    
    public void Wuerfel(){
    	//objTrans.addChild(new ColorCube(0.1));  
    	BranchGroup bg = new BranchGroup();
    	bg.setCapability(BranchGroup.ALLOW_DETACH);
    	bg.addChild(new ColorCube(0.1));
    	objTrans.addChild(bg);
    }
    
    public void Kugel(){
    	BranchGroup bg2 = new BranchGroup();
    	bg2.setCapability(BranchGroup.ALLOW_DETACH);
    	bg2.addChild(new Sphere(1));
    	objTrans.addChild(bg2);
    	//objTrans.addChild(new Sphere(1));  	
    }
    
    public void Cylinder(){
    	Appearance app = new Appearance();
    	app.setColoringAttributes(new ColoringAttributes (1,0,1,0));
    	Cylinder colorcube1=new Cylinder((float)12,5, app);	 
    	//objTrans.addChild(colorcube1);  
  	
    	BranchGroup bg3 = new BranchGroup();
    	bg3.setCapability(BranchGroup.ALLOW_DETACH);
    	bg3.addChild(colorcube1);
    	objTrans.addChild(bg3);
    	
   
    }
}
```


----------



## Marco13 (10. Jan 2010)

Sie nimmt langsam ab, aber ... naja. Diese vorgefertigten Primitive hatte ich nie verwendet. Offenbar brauchen die ein Licht, damit man sie sieht. Könnte man sicher umgehen, aber mal schnell zusammengeschustert...:

```
// From [url]http://www.java-forum.org/spiele-multimedia-programmierung/94294-java3d-objekte-entfernen-hinzufuegen.html#post599590[/url]

import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.vecmath.*;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {

    private TransformGroup objTrans;


    public static void main(String args[]) {
        JFrame fenster = new JFrame ("Java3D");
        fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

   //////Beginn GUI
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);

         JPanel panel= new JPanel();
         Button aButton = new Button("Würfel");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
            drawingPanel.add("North",panel);


        final TestLoeschenUndEinfuegen aufrufen = new TestLoeschenUndEinfuegen();

            aButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Wuerfel();
                        }
                      }
                    );

                    bButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Kugel();
                        }
                      }
                    );

                    cButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Cylinder();
                        }
                      }
                    );
//////Ende GUI

    ///Beginn Universum erstellen
                    GraphicsConfiguration config =
                        SimpleUniverse.getPreferredConfiguration();
                    Canvas3D c = new Canvas3D(config);
                    SimpleUniverse univ = null;
                    univ = new SimpleUniverse(c);
                      univ.getViewingPlatform().setNominalViewingTransform();
                    //univ.getViewer().getView().setMinimumFrameCycleTime(5);

                    drawingPanel.add("Center",c);

                    aufrufen.objTrans = new TransformGroup();
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
                    BranchGroup objRoot = new BranchGroup();
                    //objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    objRoot.addChild(aufrufen.objTrans);

                    createLights(objRoot);

                    //Aufruf eines Objektes
                    //aufrufen.Wuerfel();
                    aufrufen.Kugel();

                        // Have Java 3D perform optimizations on this scene graph.
                        //objRoot.compile();
                        univ.addBranchGraph(objRoot);

                fenster.pack();
            }

    public void Loeschen(){  //Objekte Löschen
        objTrans.removeAllChildren();
        }

    public void Wuerfel(){
        //objTrans.addChild(new ColorCube(0.1));
        BranchGroup bg = new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(new ColorCube(0.1));
        objTrans.addChild(bg);
    }

    static void createLights(BranchGroup bg)
    {
        AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        bg.addChild(lightA);
        DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(new BoundingSphere());
        Vector3f direction1 = new Vector3f(-1.0f, -1.0f, -0.5f);
        direction1.normalize();
        lightD1.setDirection(direction1);
        lightD1.setColor(new Color3f(0.0f, 0.0f, 1.0f));
        bg.addChild(lightD1);
    }


    Appearance createAppearance()
    {
        Appearance appear = new Appearance();
        Material material = new Material();
        material.setShininess(50.0f);
        appear.setMaterial(material);
        return appear;
    }



    public void Kugel(){
        BranchGroup bg2 = new BranchGroup();
        bg2.setCapability(BranchGroup.ALLOW_DETACH);
        bg2.addChild(new Sphere(0.1f, Sphere.GENERATE_NORMALS, createAppearance()));
        //bg2.addChild(new ColorCube(0.1));
        objTrans.addChild(bg2);

    }

    public void Cylinder(){
        Cylinder colorcube1=new Cylinder((float)0.1f,0.5f, createAppearance());
        BranchGroup bg3 = new BranchGroup();
        bg3.setCapability(BranchGroup.ALLOW_DETACH);
        bg3.addChild(colorcube1);
        objTrans.addChild(bg3);


    }
}
```


----------



## Mirkko (10. Jan 2010)

Hallo Marco,
da hätte ich eigentlich selber drauf kommen sollen
ein RICHTIG GROSSES DANKE FÜR DEINE BEMÜHUNGEN, DU BIST MEIN GANZ GEHEIMER HELD VON DIESEM WEEKEND!!!

Anbei der fertige Code, für alljene, die auch irgend einmal das selbe Problem haben.
Hab den Code noch ergänzt mit der Möglichkeit die Objekte rotieren zu lassen.

```
// From [url]http://www.java-forum.org/spiele-multimedia-programmierung/94294-java3d-objekte-entfernen-hinzufuegen.html#post599590[/url]
 
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.vecmath.*;
 
import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;
 
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
 
 
public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
 
    private TransformGroup objTrans;
    private BranchGroup bg = new BranchGroup();
    
 
 
    public static void main(String args[]) {
        JFrame fenster = new JFrame ("Java3D");
        fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
   //////Beginn GUI
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
 
         JPanel panel= new JPanel();
         Button aButton = new Button("Würfel");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
            drawingPanel.add("North",panel);
            
 
        final TestLoeschenUndEinfuegen aufrufen = new TestLoeschenUndEinfuegen();
 
            aButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Wuerfel();
                        }
                      }
                    );
 
                    bButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Kugel();
                        }
                      }
                    );
 
                    cButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Cylinder();
                        }
                      }
                    );
//////Ende GUI
 
    ///Beginn Universum erstellen
                    GraphicsConfiguration config =
                        SimpleUniverse.getPreferredConfiguration();
                    Canvas3D c = new Canvas3D(config);
                    SimpleUniverse univ = null;
                    univ = new SimpleUniverse(c);
                      univ.getViewingPlatform().setNominalViewingTransform();
                    //univ.getViewer().getView().setMinimumFrameCycleTime(5);
 
                    drawingPanel.add("Center",c);
 
                    aufrufen.objTrans = new TransformGroup();
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
                    
                    aufrufen.objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            		
                    BranchGroup objRoot = new BranchGroup();
                    //objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    objRoot.addChild(aufrufen.objTrans);
 
                    createLights(objRoot);
 
                    //Aufruf eines Objektes
                    aufrufen.Wuerfel();
                    //aufrufen.Kugel();
                    aufrufen.Mausmanipulation();
 
                        // Have Java 3D perform optimizations on this scene graph.
                        //objRoot.compile();
                        univ.addBranchGraph(objRoot);
                        
             //Manipolieren von Objekten
                       
                        
 
                fenster.pack();
            }
    
 public void Mausmanipulation(){
	//Erlauben dass mit Maus Betrachten
	    
	      BoundingBox boundBox=new BoundingBox (new Point3d(-1000,-1000,-1000),new Point3d(1000,1000,1000));
		
		  //rotieren mit der linken Maustaste
		    MouseRotate behavior = new MouseRotate(objTrans);
		    behavior.setTransformGroup(objTrans);
		    behavior.setSchedulingBounds(boundBox);
		    objTrans.addChild(behavior);
		    
		  //verschieben mit rechter Maustaste
		    MouseTranslate mouseTranslate= new MouseTranslate(objTrans);
		    mouseTranslate.setSchedulingBounds(boundBox);
		    objTrans.addChild(mouseTranslate);
		    
		  //zoomen mit mittlerer Maustaste
		    MouseZoom mouseBeh2=new MouseZoom(objTrans);
		    mouseBeh2.setSchedulingBounds(boundBox);
		    objTrans.addChild(mouseBeh2);
		    
		  // zoom mit MouseWheelZoom
		    MouseWheelZoom mouseWheel=new MouseWheelZoom(objTrans);
		    mouseWheel.setSchedulingBounds(boundBox);
		    objTrans.addChild(mouseWheel);       
 }
    
    public void Loeschen(){  //Objekte Löschen
       // objTrans.removeAllChildren();
        objTrans.removeChild(bg);
        
        }
 
    public void Wuerfel(){
        //objTrans.addChild(new ColorCube(0.1));
    	 bg = new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(new ColorCube(0.1));
        objTrans.addChild(bg);
    }
 
    static void createLights(BranchGroup bg)
    {
        AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        bg.addChild(lightA);
        DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(new BoundingSphere());
        Vector3f direction1 = new Vector3f(-1.0f, -1.0f, -0.5f);
        direction1.normalize();
        lightD1.setDirection(direction1);
        lightD1.setColor(new Color3f(0.0f, 0.0f, 1.0f));
        bg.addChild(lightD1);
    }
 
 
    Appearance createAppearance()
    {
        Appearance appear = new Appearance();
        Material material = new Material();
        material.setShininess(50.0f);
        appear.setMaterial(material);
        return appear;
    }
 
    public void Kugel(){
      bg = new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(new Sphere(0.1f, Sphere.GENERATE_NORMALS, createAppearance()));
        //bg2.addChild(new ColorCube(0.1));
        objTrans.addChild(bg);
 
    }
 
    public void Cylinder(){
        Cylinder colorcube1=new Cylinder((float)0.1f,0.5f, createAppearance());
        bg= new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(colorcube1);
        objTrans.addChild(bg);
 
 
    }
}
```


----------

