# Java3D Applet flackert wenn ein Button(HTML) gedrückt wird



## mattn (28. Jun 2010)

wie der titel schon sagt flackert das applet wenn ich nen html button drück...
laut output des unten stehenden codes ist DoubleBuffering aktiviert...
warum flackert es dennoch 

```
//Double Buffering Check
		if (c.getDoubleBufferAvailable()== true) System.out.println("c.getDoubleBufferAvailable() =  TRUE"); 	else System.out.println("c.getDoubleBufferAvailable() =  FALSE");
		if (c.getDoubleBufferEnable() == true) System.out.println("getDoubleBufferEnable() =  TRUE"); 			else System.out.println("getDoubleBufferEnable() =  FALSE");
```


----------



## Marco13 (2. Jul 2010)

Abgesehen von

```
System.out.println("c.getDoubleBufferAvailable() = "+c.getDoubleBufferAvailable());
```
bräuchte man da mehr infos.


----------



## L-ectron-X (2. Jul 2010)

Was für ein Objekt ist 'c'? Hast du ein Applet oder ein JApplet?
Kann man sich das Applet mal irgendwo ansehen und ausprobieren, damit man mal sieht, was passiert?


----------



## mattn (5. Jul 2010)

c ist mein canvas objekt...


new node wird via javascript aufgerufen


```
public class index extends Applet{
	
	private SimpleUniverse u = null;
	GraphicsConfiguration config;
	Canvas3D c;
	BranchGroup rootBG, boxBG, lineBG;
	BoundingSphere BigBounds = new BoundingSphere(new Point3d(),100000);
	
	Box box;
	TransformGroup boxTG;
	Point3d bar;
	Point3f[] plaPts;
	Point3f tmpPt;
	Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
	TransformGroup BoxTG, BoxTG2;
	Transform3D BoxT3D, BoxT3D2;
	Shape3D plShape;
	Appearance boxAppearance;

/*************************************************************/	
	
	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(){
		System.out.println("newNode");
		boxBG = new BranchGroup();
		boxTG = new TransformGroup();
		box= new Box(0.01f,0.01f,0.01f, boxAppearance);
	
		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);
	
	}

	
	
	public class MyCallbackClass extends Object implements PickingCallback{
        public void transformChanged(int type, TransformGroup tg) {
        	//todo
        }
	} 

	
	
	
	
	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);
			//PickTranslateBehavior
			PickTranslateBehavior pickT = new PickTranslateBehavior(rootBG, c, BigBounds);
			PickingCallback myCallback = new MyCallbackClass();
			pickT.setupCallback(myCallback);
			
			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(); 
			rootBG.addChild(pickT);
			rootBG.compile();
			return rootBG;	 
		}
	
	public void destroy(){
		System.out.println("destroy");
		u.cleanup();
	}
	

}
```

allerdings werd ich später evtl. JApplet benuzen müssen


----------



## L-ectron-X (5. Jul 2010)

Dann baue das Ganze gleich als Swing-Applet auf, da hast du das DoubleBuffering bereits inclusive.
Canvas ist eine AWT-Komponente, da müsste das DoubleBuffering vom Programmierer implementiert werden.


----------



## mattn (27. Jul 2010)

geht leider nicht so ohne weiteres... da die komponenten, wie z.b. PickTranslateBehavior explizit das canvas object brauchen... jcanvas geht auch nicht

das kuriose ist aber... das nur die buttons das flackern verursachen.... radiobuttons nicht ???:L


----------



## L-ectron-X (27. Jul 2010)

Von welchem Typ sind die Buttons? Hast du an irgendeiner Stelle noch andere AWT-Komponenten?
Swing und AWT sollten nicht gemischt werden.


----------



## mattn (27. Jul 2010)

das ganze ist so aufgebaut...
tablelayout(statt frames) 
im oberen teil wird das applet via  <applet> tag eingbunden.
im unteren teil habe ich normale html buttons und radiobuttons...
wenn ich auf einen button klick, wird eine javascriptfunktion aufgerufen, welche die methoden im applet auruft(evtl noch parameter übergibt)

wie gesagt bei klick auf den button "neu" oder "lösche" flackert das ganze plugin.... wenn ich aber die radiobox anklick... flackert garnichts....

wie oben schon gepostet... kann man ja canvas3d nach doublebuffering abfragen.. und wenn ich das mache... sagt mir java "true"

hier nen snipplet

```
<script language="JavaScript">
<!--
    function newNode() {
      document.j3dApplet.newNode();
    }

     function chkMode(){
      var i;
      /* jeden Radiobutton abchecken : */
      for (i=0;i<document.modeForm.elements.length;i++){
        if (document.modeForm.elements[i].checked){
         document.j3dApplet.chkMode(document.modeForm.elements[i].value);
        }
      }
    }


//-->
</script>

<form name="form">
  <input type="button" name="neu" value="neu" onClick="newNode();">
  <input type="button" name="lösche" value="lösche" onClick="deleteNode();">   
</form>


<form name="modeForm">
  view: <input type="radio" name="mode" value="view" onClick="chkMode()"  checked="true"> <br>
  manipulate <input type="radio" name="mode" value="manipulate" onClick="chkMode()">  <br>
</form>
```

im applet benutz ich folgende Komponenten...
String, Vector...

```
SimpleUniverse
GraphicsConfiguration - awt
Canvas3D
BranchGroup
TransformGroup
Transform3D
BoundingSphere
PickCanvas
Appearance
PolygonAttributes
Primitive
Box - swing
Point3d
Point3f
BoundingBox
PickTranslateBehavior
PickZoomBehavior
DirectionalLight
AmbientLight
Shape3D
```


----------



## L-ectron-X (27. Jul 2010)

Hast du auch mal andere Browser ausprobiert, ob es da auch flackert?
Kann man sich das mal irgendwo ansehen?


----------



## mattn (27. Jul 2010)

kann es heut abend/nacht(komm dann erst nach haus) - mal hochladen...


----------



## mattn (29. Jul 2010)

so hier hab ich die klassen gezipt...
bitte auch das readme lesen... 
achja...
verschieben der würfel geht mit der rechten bzw mittlerren(klick aufs rad) maustaste - manipulate
im view modus... rotieren mit der linken... verschieben mit der rechteun und zoomen mit der

edit
die html seite liegt dann im odner bin


----------



## mattn (20. Aug 2010)

mattn hat gesagt.:


> so hier hab ich die klassen gezipt...
> bitte auch das readme lesen...
> achja...
> verschieben der würfel geht mit der rechten bzw mittlerren(klick aufs rad) maustaste - manipulate
> ...



da keine lösung gefunden wurde habe ich einfach nen panel mit awt komponenten ans applet gehängt welche ohne flackern funktionieren


----------

