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

mattn

Aktives Mitglied
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
Java:
		//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");
 
Zuletzt bearbeitet:
Abgesehen von
Code:
System.out.println("c.getDoubleBufferAvailable() = "+c.getDoubleBufferAvailable());
bräuchte man da mehr infos.
 
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?
 
c ist mein canvas objekt...


new node wird via javascript aufgerufen

Java:
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
 
Zuletzt bearbeitet:
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.
 
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
 
Zuletzt bearbeitet:
Von welchem Typ sind die Buttons? Hast du an irgendeiner Stelle noch andere AWT-Komponenten?
Swing und AWT sollten nicht gemischt werden.
 
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
HTML:
<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...
Java:
SimpleUniverse
GraphicsConfiguration - awt
Canvas3D
BranchGroup
TransformGroup
Transform3D
BoundingSphere
PickCanvas
Appearance
PolygonAttributes
Primitive
Box - swing
Point3d
Point3f
BoundingBox
PickTranslateBehavior
PickZoomBehavior
DirectionalLight
AmbientLight
Shape3D
 
Zuletzt bearbeitet:
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
 

Anhänge

Zuletzt bearbeitet:
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

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

Zurück
Oben