[J3D]komischer rootBG.removeChild Bug

mattn

Aktives Mitglied
hi...
ich will in meiner gui objekte(box) dynamisch hinzufügen und enfernen können...
hinzufügen is kein problem... das passt soweit... aber beim entfernen hab ich ein bug aus dem ich nicht schlau werde .... also erstmal der code....
Java:
private BranchGroup createSceneGraph() {
.
.
.
  pickC = new PickCanvas(c, rootBG);
  c.addMouseListener(this);
}

Java:
public void newNode(){

		String boxIdString = Integer.toString(boxId);
		boxBG = new BranchGroup();
		boxTG = new TransformGroup();
		box= new Box(0.01f,0.01f,0.01f, boxAppearance);
		box.setName("box"+boxIdString);
		boxBG.setCapability(BranchGroup.ALLOW_DETACH);
		boxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		boxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		boxTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
		boxTG.addChild(box);
		boxBG.addChild(boxTG);
		rootBG.addChild(boxBG);
		boxId++;

	}

es wird einfach für jedes element eine branchgroup(zum entfernen des objektes), und transformgroup erstellt....
desweiteren wird jeder hinzugefügten box ein name zugewiesen "box+nummer" die nummer ist wie ihr seht fortlaufend....

Java:
	public void deleteNode(){
		rootBG.setCapability(BranchGroup.ALLOW_DETACH);
		//rootBG.removeChild(boxBG);
		if (picktPrimitive != null){
			System.out.println("zulöschendes Element: " + picktPrimitive.getName());
			rootBG.removeChild(picktPrimitive.getParent().getParent());
		}
		else System.out.println("Nothing picked");
	}

und der vollständigkeit halber noch mouseClicked...

Java:
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		//PickCanvas
		pickC.setShapeLocation(e);
	    PickResult result = pickC.pickClosest();

	    if (result == null) {
	       System.out.println("Nothing picked");
	    } 
	    else {
	       picktPrimitive = (Primitive)result.getNode(PickResult.PRIMITIVE);
	      // Shape3D s = (Shape3D)result.getNode(PickResult.SHAPE3D);
	       if (picktPrimitive != null) {
	          System.out.println(picktPrimitive.getName());
	       } 
	    }
	}

das picking klappt wunderbar --> console gibt mir das gepickte objekt aus
so nun zum bug....
also wenn ich bei
Code:
deleteNode()
das gepickte element hole(es ist wirklich das element ^^) und auf den vater vom vater (TG --> BG) verweis und diese branchgroup entfernen will klappt das nicht ... der macht einfach mal garnichts....



Code:
wenn ich allerdings statisch auf das element boxBG verweis verschwindet es ... [code]//rootBG.removeChild(boxBG);
[/code] EDIT: hab mich geirrt.. das klappt auch nicht :(


allergings klappt es wenn ich
Code:
rootBG.removeChild(boxBG);
in die callback-methode vom PickTranslateBehavior packe (also wenn ich ein objekt beweg verschwindet es -> so wie es beim funktionsaufruf passieren soll)

weiß wer rat ?
 
Zuletzt bearbeitet:

mattn

Aktives Mitglied
alles klar ... applet code

Java:
import com.eigeneImports.PickTranslateBehavior;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Enumeration;
import java.util.Vector;

import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.LineArray;
import javax.media.j3d.Material;
import javax.media.j3d.Node;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;

import javax.swing.JApplet;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.picking.PickingCallback;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.pickfast.PickTool;
import com.sun.j3d.utils.picking.PickCanvas;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.universe.SimpleUniverse;

public  class index extends JApplet implements MouseListener {
	
	private SimpleUniverse u = null;
	GraphicsConfiguration config;
	Canvas3D c;
	BranchGroup boxBG, rootBG, lineBG;  
	TransformGroup boxTG;
	BoundingSphere BigBounds = new BoundingSphere(new Point3d(),100000);
	int boxId = 1;
	Box box;
	PickCanvas pickC;
	Point3f[] plaPts;
	Point3f tmpPt;
	Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
	Shape3D plShape;
	Appearance boxAppearance;
	Primitive picktPrimitive;

/*************************************************************/	
	public void init(){
		System.out.println("init");
		setLayout(new BorderLayout());
		config = SimpleUniverse.getPreferredConfiguration();
		c= new Canvas3D(config);
		add("Center", c);
		u = new SimpleUniverse(c);	
		u.getViewingPlatform().setNominalViewingTransform();
		u.addBranchGraph(createSceneGraph());
	}
	
	public void licht(){
		AmbientLight ALgt = new AmbientLight(new Color3f(1f,1f,1f));
		DirectionalLight DLgt = new DirectionalLight(new Color3f(1f,1f,1f),
													 new Vector3f(-0.5f,-0.5f,-1f));
		ALgt.setInfluencingBounds(BigBounds);
		DLgt.setInfluencingBounds(BigBounds);
		rootBG.addChild(ALgt);
		rootBG.addChild(DLgt);
	}
	
	public void newNode(){

		String boxIdString = Integer.toString(boxId);
		boxBG = new BranchGroup();
		boxTG = new TransformGroup();
		box= new Box(0.01f,0.01f,0.01f, boxAppearance);
		box.setName("box"+boxIdString);
		boxBG.setCapability(BranchGroup.ALLOW_DETACH);
		boxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		boxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		boxTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
		boxTG.addChild(box);
		boxBG.addChild(boxTG);
		rootBG.addChild(boxBG);
		boxId++;

	}

	public void deleteNode(){
		//rootBG.setCapability(BranchGroup.ALLOW_DETACH);
		rootBG.removeChild(boxBG);
//		if (picktPrimitive != null){
//			System.out.println("zulöschendes Element: " + picktPrimitive.getName());
//			rootBG.removeChild(picktPrimitive.getParent().getParent());
//		}
//		else System.out.println("Nothing picked");
	}
	
	public class MyCallbackClass extends Object implements PickingCallback{
        public void transformChanged(int type, TransformGroup tg) {
        	//rootBG.removeChild(boxBG);      	
        	
        }
	}
	
	
	private BranchGroup createSceneGraph() {
		
			System.out.println("createSceneGraph");
			rootBG = new BranchGroup();
			rootBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
			rootBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
			rootBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
//			rootBG.setCapability(BranchGroup.ALLOW_DETACH);
			//PickTranslateBehavior
			PickTranslateBehavior pickT = new PickTranslateBehavior(rootBG, c, BigBounds);
			PickingCallback myCallback = new MyCallbackClass();
			pickT.setupCallback(myCallback);
			
			pickC = new PickCanvas(c, rootBG);
		    c.addMouseListener(this);


			
			boxAppearance = new Appearance();
			boxAppearance.setMaterial(	new Material(new Color3f(0f,0f,1f),
					   					new Color3f(0f,0f,0f),
					   					new Color3f(1f,0f,0f),
					   					new Color3f(1f,1f,1f), 
					   					100f));		

			licht();
			newNode();
			//save();
			//deleteNode();
			rootBG.addChild(pickT);
			rootBG.compile();
			return rootBG;	 
		}
	
	
	
	public void destroy(){
		System.out.println("destroy");
		u.cleanup();
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		//PickCanvas
		pickC.setShapeLocation(e);
	    PickResult result = pickC.pickClosest();

	    if (result == null) {
	       System.out.println("Nothing picked");
	    } 
	    else {
	       picktPrimitive = (Primitive)result.getNode(PickResult.PRIMITIVE);
	       if (picktPrimitive != null) {
	          System.out.println(picktPrimitive.getName());
	       } 
	    }
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	

}

HTML code

HTML:
  <HEAD> <TITLE>Workflow Prototype</TITLE>
    <script language="JavaScript">
    <!--
    function newNode() {
      document.j3dApplet.newNode();
    }
    function deleteNode(){
     document.j3dApplet.deleteNode();
    }
    //-->
    </script>
    <noscript>Bitte JavaScript Aktivieren</noscript>
  </HEAD>

  <BODY>


    <table border="1" width="100%">
      <TR height="100px">
        <th colspan="2">
          <img src="htm_img/Header.jpg" alt="Header" width="100%"/>
        </th>
      </TR>
      <TR height="550px">
        <TD width="75%">
          <applet name= "j3dApplet" code="index.class" width="100%" height="100%">
          </applet>

        </TD>
        <TD align="center"> Node Content </TD>
      </TR>
      <TR height="200px">
        <TD align="center">
          <form name="form">
            <input type="button" name="neu" value="neu" onClick="newNode();">
            <input type="button" name="lösche" value="lösche" onClick="deleteNode();">
            <b>...</b>
          </form>
        </TD>


        <TD align="center">
           <a href="#">Help</a><br>
               <a href="#">Support</a><br>
               <a href="#">Contact</a><br>
               <a href="#">etc.</a><br>
        </TD>
      </TR>
    </table>

  </BODY>

die html seite liegt (noch) im bin verzeichnis - da wo auch die class liegt

ps: du wirst es mit sicherheit wissen .. ich schreib es trotzdem hin... damit deine änderungen für die html "sichtbar" werden musst du das applet erst ausführen denn dann wird die neue class erzeugt auf die die seite zugreift
 

Marco13

Top Contributor
Wenn man in die MouseClicked ein

rootBG.removeChild(boxBG);

oder

rootBG.removeChild(picktPrimitive.getParent().getParent());

reinbaut wird es doch entfernt?

BTW: Du solltest die "deprecated"-Warnungen nicht ignorieren.
 

mattn

Aktives Mitglied
Wenn man in die MouseClicked ein

rootBG.removeChild(boxBG);

oder

rootBG.removeChild(picktPrimitive.getParent().getParent());

reinbaut wird es doch entfernt?

BTW: Du solltest die "deprecated"-Warnungen nicht ignorieren.

was ist denn das...
ich habe es gestern abend/nacht ausprobiert da ging es nicht.. heute mach ich den rechner an... habe NIX geändert und du hast recht ... es geht... warum, wieso....
naja gut -.-

"deprecated" --> mhh und was nehm ich dann statt pickingcallback

trotzdem schonmal danke das du dir die zeit nimmst zu helfen....
echt klasse...


btw... kann man das thema löschen... weil da es ja heute geht(warum es gestern nicht ging weiß der teufel) ist der thread mehr als überflüssig
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben