JavaFX Zeichenprogramm mit JavaFX FXML

udo-100

Mitglied
Hallo,
bin gerade dabei ein kleines Zeichenprogramm mit JavaFX zu erstellen.
Leider konnte ich mit Google kein Beispiel finden wie man nachträglich, also währen der Laufzeit eines Programmes Linien oder Rechtecke auf ein Canvas zeichnen kann.
Die Beispiele die ich finde gehen immer davon aus das die Zeichenobjekte vorher feststehen und als Node eingefügt werden.
Weis jemand ein Tutorial oder Beispiel? (Buch)
Danke..
 
Im Prinzip ist dieser Code jederzeit aufrufbar.
Nehmen wir an, du hast dein Canvas in einem FXML deklariert, dann musst du nun eigentliche in der #initialize-Methode den GC (GraphicsContext, oder so, in jetzt nicht der Canvas-Profi) aus dem Canvas holen und speichern, dann kannst du damit jederzeit auf dem Canvas "rumpinseln".
Bedenke nur, dass das Canvas nicht skaliert oder seine Grösse ändert, dazu musst du selbst etwas implementieren (gab es hier im Forum auch schon, die Frage).
Wenn du Probleme hast, aber schon etwas Code, dann poste ihn und wir schauen mal, ob sich was machen lässt, dich in die richtige Richtung zu schubsen 🙂
 
Ok, das mit der Canvas hab ich jetzt hingekriegt. Danke..
Da ich in meinem Programm aber die gezeichneten Figuren mit der Maus bewegen möchte, überlege ich ob die Canvas der richtige Weg ist. Ich denke das die einzelnen Figuren oder Linien besser als Objekte gehandelt werden müssten. Man könnte das ganze doch auch mit Shapes aufbauen. Da sind die Geometrien gleich Objekte.
Nur wie füge ich im Programmablauf noch Objekte zu meiner Stage hinzu?
 
Das hängt jetzt von der Menge Shapes ab, die du bewegen möchtest (bedenke, dass du am Ende eventuell SEHR viele Objekte auf dem Scene-Graph haben kannst).
Wenn du also Shapes (Formen, wie etwa Circles) auf einem Pane hin und her bewegen möchtest, schau dir bitte mal dieses Snipped von jewelsea (eich recht prominenter Poster auf StackOverflow bezüglich JavaFX) an:
https://gist.github.com/jewelsea/4569878

Ansonsten: Man kann natürlich auch gezeichnete Elemente auf einem Canvas bewegen. Ein Beispiel wird in einer Antwort (ebenfalls) auf StackOverflow beschrieben (wieder mal von jewelsea...):
http://stackoverflow.com/questions/21396055/moving-shapes-in-javafx-canvas

Generell wird in dem Tutorial von Oracle auf vieles eingegangen (z.B auch, wie man Ebenen simulieren kann)
http://docs.oracle.com/javase/8/javafx/graphics-tutorial/canvas.htm

Generell aber kann man vieles hier auch wie in Swing machen. Auf www.java2s.com gibt es ein Tutorial (oder besser ein Snipped) dazu, wie man eine Form auf einem Canvas mit der Mouse bewegen kann.
Ich denke der Trick ist, ein entsprechendes Objekt mit den Koordinaten-Daten zu halten, um quasi bei Drag&Drop zu testen, ob man innerhalb der Boundaries des gezeichneten Shapes ist und bei jedem "Mouse Move" die entpsrechende Form neu zu zeichen.

Kurzum: Viele Wege führen nach Rom. Wenn du nur wenige Formen anzeigen und bewegen willst, schau dir den ersten Link an. Ansonsten die anderen.
 
@dzim ...Danke für die Links.
Mich würde interessieren wie das bei professionellen CAD-Programmen verwaltet wird.
Da kann man jede Linie anklicken und den Endpunkt mit der Maus bewegen.
Das müssten dann doch auch Objekte sein, die im Arbeitsspeicher gehalten werden, oder?
 
Ich kenne mich zu wenig mit CAD-Applikationen aus, um da eine wirklich gute Aussage zu machen... Ich vermute aber, viele davon sind 3D und werden dies über direkte oder indirekte (über APIs wie libGDX, ...) Aufrufe an OpenGL (oder andere Frameworks) machen. Das bedeutet, dass sie im Speicher wahrscheinlich auch eher Referenzen auf die Linien/Endpunkte haben.

Ansonsten meine ich mich zu erinnern, dass Eclipse-Plugins wie das für UML, EMF, XML und so weiter über Canvas funktionieren (finde leider so schnell keine Referenz darauf oder Stellen im Code, musst daher erst einmal mit der Behauptung meinerseits leben).

Das Problem mit dem Shape-Ansatz in JavaFX ist: Dieser Ansatz ist Otto-Normal gut zu gebrauche und relativ leicht verständlich - und ich meine mich an Beispiele zu erinnern wo tausende Shapes noch flüssig dargestellt werden konnten. Aber: Es ist Overhead. Du hast recht grosse Shape-Objekte die direkt auf dem Scene-Graph gerendert werden.

Bei der Variante Canvas mit Hilfs-Objekten, die die Form und Position beschreiben, hast du (IMHO) weniger Overhead.

DISCLAIMER: Du merkst schon, dass ich hier recht schwammig formuliere. Ich bin mir auf dem Gebiet nicht wirklich sicher. Vielleicht kann ja noch einer der Swing-Gurus hier ein paar Ideen beisteuern. Und du könntest vielleicht noch ein wenig erläutern, was du eigentlich erreichen möchtest. Einen Editor, bei dem man Formen hin und her schiebt?

Edit: http://stackoverflow.com/questions/29900837/whats-the-best-way-to-create-a-uml-element-in-javafx-8-0
Auch wenn dieser Eintrag bei StackOverflow keine abschliessende Antwort hat, scheint man dort den Weg der Shapes (also Scene-Graph-Objekete) mit SVGPath gewählt zu haben.

Edit2: Load UI ist im Moment die einzige mir bekannte Anwendung, die so einen Editor zur Verfügung stellt. Dieser scheint Canvas zu verwenden. Allerdings ist der Code jetzt nicht ganz trivial, da die Application als OSGi-Anwendung aufgebaut ist. Und während die Webseite noch Spring Dynamic Modules nennt, scheint dies zwischenzeitlich zu Eclipse Virgo geworden zu sein. Mit einem grossen Fragezeichen, ob das Projekt noch fortgeführt wird.
 
Zuletzt bearbeitet:
Da ich beruflich mit CAD-Programmen arbeite, würde mich es interessieren wie das die Profis machen.
Für das Programm das ich im Kopf habe, möchte ich definierte Geometrien auf der Canvas einfügen und dann mit der Maus verschieben und drehen können. Mehr wie 50 Objekte werden es nicht werden, möchte aber von der Menge nicht eingeschränkt sein. Da ich das ganze als Übung zum Objektorientierten programmieren mache, möchte ich gerne meine Zeichenobjekte entsprechend verwalten. Der OOP-Ansatz ist mir auch ziemlich klar, ich schwimme nur mit der JavaFX Gui und dem Stage Szenario ein bisschen.
 
Na dann solltest du vorerst wohl erst recht bei dem Stage-Szenario bleiben. Also mit Shapes - Circle, Rectange, SVGPath, etc. - arbeiten! 🙂
Wenn du das schaffst, hast du das Arbeiten mit dem Scene-Graph definitiv verstanden.
 

Zurück
Oben