2016-03-18 3 views
6

Ich arbeite an einer Anwendung, um einige problemspezifische 2D-Geometrie zu modellieren. Und natürlich möchte ich diese Geometrie auf dem Bildschirm zeichnen, damit der Benutzer sie tatsächlich sieht.So erweitern Sie die JavaFX-Shape-Klasse, um benutzerdefinierte Formen zu implementieren

JavaFX hat einige 2D-Formen wie Rechtecke, Ellipsen, etc. Es hat auch kubische und quartic Kurven, implementiert als Bezier-Kurven. Die Suche nach benutzerdefinierten Formen hat nicht geholfen, da ich nur Beispiele für die Aufnahme von Formelementen wie Pfaden gefunden habe, die ich zusammengefügt habe, um eine benutzerdefinierte Form wie ein Herz oder einen Diamanten zu zeichnen. Die Suche nach Informationen zur Implementierung einer neuen Form durch Erweiterung der Shape-Klasse war noch weniger hilfreich.

Was ich zeichnen möchte, sind B-Spline-Kurven beliebiger Reihenfolge und Länge. Ich weiß, wie man die Splines selbst berechnet und implementiert, aber ich weiß nicht, wie man sie als eine neue Form oder einen Form-Wrapper implementiert.

Ich schaute auf den Quellcode von JavaFX und den Dokumentarfilm. Es scheint, als wären diese Formen selbst eine Art Wrapper-Klasse. Z.B. Die Ellipse-Klasse enthält eine Ellipse als Element, das Teil des Geometriepakets ist. Diese Rekursion geht ziemlich weit.

Jetzt muss es eine Art von Methode geben, die JavaFX verwendet, um die Kurve tatsächlich zu zeichnen, aber ich konnte es nicht finden.

Also wie erweitere ich eine JavaFX-Form, um z. eine Spline-Klasse? Welche Methoden/Klassen sind der Schlüssel für Java, um sie zu zeichnen?

Ich hoffe, dass mir jemand helfen kann.

Mit freundlichen Grüßen Thorsten

+0

Können Sie genauer erklären, warum [Pfad] (http://docs.oracle.com/javase/shape/Path.html) (die Shape erweitert) nicht ausreicht ? – VGR

+1

Ich glaube nicht, dass Sie in der Lage sein werden, Shape direkt zu erweitern und Ihre erweiterte Form gerendert zu bekommen, ohne APIs zu verwenden, die folgendermaßen markiert sind: "@deprecated Dies ist eine interne API, die nicht zur Verwendung gedacht ist und in der nächsten Version entfernt wird". – jewelsea

+0

@VGR Mit Path würde ich einfach verschiedene Formen zu einem kombinieren. Das beschränkt mich auf die Standardformklassen. So konnte ich beispielsweise nur Kurven bis zum vierten Grad zeichnen. Für alles ohne prebuild-Klasse müsste ich diese Kurve mit den vorgefertigten Form-Klassen erstellen und Kurven und Linien-Segmente zusammensetzen, um eine Approximation zu erstellen. –

Antwort

0

Ich würde einen Blick auf, wie JSilhoutte ihre Formen umgesetzt hat.

Cross beispielsweise erstreckt sich nicht Shape, aber es erzeugt ein Shape ein Kreuz darstellt, die durch zwei Rechtecke zu schaffen und sie Shape.union Verwendung kombiniert. Hier ist die entsprechende Methode:

@Override 
protected void calculateShape() { 
     double cx = getCenterX(); 
     double cy = getCenterY(); 
     double r = getRadius(); 
     double n = validateRoundness(getRoundness()); 
     double w = validateWidth(getWidth(), r); 

     double arcWH = w * n; 
     Rectangle beam1 = new Rectangle(cx - r, cy - (w/2), r * 2, w); 
     Rectangle beam2 = new Rectangle(cx - (w/2), cy - r, w, r * 2); 
     beam1.setArcWidth(arcWH); 
     beam1.setArcHeight(arcWH); 
     beam2.setArcWidth(arcWH); 
     beam2.setArcHeight(arcWH); 
     Shape shape = Shape.union(beam1, beam2); 

     shape.getStyleClass().addAll("silhouette", "silhoutte-cross"); 

     setShape(shape); 
} 

So könnte man Shape.union verwenden, um gemeinsam mehr CubicCurve/QuadCurve Formen kombinieren Sie Ihre B-Spline-Kurven beliebiger Reihenfolge und Länge zu erstellen.

Verwandte Themen