# Interaktion von J3D in einem Applet



## Ariovist (18. Mrz 2009)

Hallo zusammen,

ich habe folgendes Problem: Ich habe ein Canvas3D Objekt in einem JPanel in einem JApplet. Nun kann in einem JTextField neben dieser 3D-Komponente ein Wert für einen Winkel eingegeben werden. Diesen möchte ich anschließend nutzen, um eine Drehung einer TransformGroup auf eben jenem Canvas3D Objekt vorzunehmen.

In Tutorials habe ich lediglich gefunden, wie man mittels Behavior Änderungen in Folge von Mouse-, Tasten-, etc. Vorgänge auslösen können.

Was ist der richtige Ansatz, um dies zu realisieren? Verwendet man Behavior? Oder kann man ein Parameter übergeben? Wenn ich etwas wie void actionPerformed(...) verwende, kann ich zwar eine globale Variable ändern, aber an meinem 3D Objekt ändert sich nichts. Gäbe es hier eine Möglichkeit ähnlich wie repaint() dieses zu aktualisieren?

Vielen Dank für Antworten!

Thema Google: Ja, ich habe danach gesucht, aber nichts gefunden. Falls ich nur die falschen Begriffe verwendet haben sollte, freue ich mich natürlich auch über einen Link...

Beste Grüße!


----------



## Marco13 (18. Mrz 2009)

Man kann da was mit WakeupOnAWTEvent (Java 3D 1.3.2) machen, aber mein letzter Stand ist, dass es _angeblich_ auch OK sein soll, direkt aus den AWT-Event-Handling-Methoden (also z.B. aus actionPerformed heraus) den Szenegraphen zu manipulieren. 

Zum Übernehmen der Werte... wenn du eine Transform3D änderst, musst du entweder dieselbe Instanz verändern, wie die, die im TransformNode hängt, oder dem TransformNode die neue Transform3D zuweisen (dazu müssen aber die passenden Capability Bits gesetzt sein ... ALLOW_TRANSFORM_WRITE ...)


----------



## Illuvatar (18. Mrz 2009)

Marco13 hat gesagt.:


> aber mein letzter Stand ist, dass es _angeblich_ auch OK sein soll, direkt aus den AWT-Event-Handling-Methoden (also z.B. aus actionPerformed heraus) den Szenegraphen zu manipulieren.



Hmm, hast du da eine Quelle?


----------



## Ariovist (18. Mrz 2009)

Hallo Marco,

vielen Dank für die Antwort. Ich habe das mal ausprobiert, wenn ich aus der actionPerformed() drauf zu greife, funktioniert es.

Die andere Lösung, die du genannt hast, klingt eleganter. Mein Problem dabei ist, was muss der Funktion WakeUpOnAWTEvent(...) übergeben werden? Gibt es sinngemäß etwas wie MeinButton.clicked() oder so, was aussagt, dass ein bestimmter Button angeklickt wurde?

Danke nochmals 

Viele Grüße


----------



## Marco13 (18. Mrz 2009)

@Illuvatar: "It is permissible to make scene graph modifications, including branch graph insertion and removal, from any thread." (Kevin Rushforth, Java 3D Team, Sun Microsystems) - von Re: [JAVA3D] direct event handling with listeners
Glauben wir ihm das mal 

@Ariovist: Ehrlich gesagt habe ich den WakeUpOnAWTEvent selbst noch nicht verwendet, und kann definitiv nicht sagen, ob das "eleganter" wäre, als direkt die AWT-Events zu verwenden ... (_einfacher_ ist es aber vermutlich nicht). Man kann sich aber von einem WakeUpOnAWTEvent die AWTEvents abholen, die den Event ausgelöst haben ... vielleicht wäre das ein Ansatzpunkt....


----------

