2017-06-05 11 views
1

Ich möchte Rechteck, Linie usw. auf Leinwand mit GraphicsContext zeichnen.ID für Objekte auf JavaFX Canvas setzen

Rectangle rect = new Rectangle(20,20,10,10); 
rect.setId("myRect"); 
gc.draw(rect); 

Gibt es so etwas in JavaFX? Oder gibt es eine Möglichkeit, auf gezeichnete Canvas-Objekte zuzugreifen?

+0

Machen Sie einen Schnappschuss und zeichnen Sie das resultierende Bild ... Oder einfach die Eigenschaften der verwenden Rechteck, um ein Rechteck auf der Leinwand zu zeichnen, das wie der Rechteckknoten aussieht, den Sie cr haben eated ... – fabian

+0

Bitte überprüfen Sie Ihre Tags, da Sie mehrere Versionen von javafx getaggt haben. – Zimano

+0

danke Fabian. Ich versuche den Rechteckknoten zum Zeichnen auf Leinwand zu verwenden. Aber dann kann ich dieses Rechteck nicht mit der Mausereignisaktion auf die Leinwand ziehen. Also dachte ich, dass das Rechteck auf der Leinwand dasselbe wie der Rechteckknoten sein muss. – mbcrb

Antwort

1

Von dem, was ich weiß, können Sie nicht Rectangle s direkt auf einer Leinwand zeichnen - Rectangle ist ein JavaFX-Knoten, aber die Canvas-API ist viel niedriger Ebene und nur sehr grundlegende Zeichenbefehle. Zum Beispiel für das Rechteck zeichnen, wäre es:

GraphicsContext gc = theCanvas.getGraphicsContext2D(); 
gc.fillRect(20,20,10,10); 

Dies ist jedoch nicht, dass Sie das Rechteck manipulieren weiter nicht lassen. was ich tue, ist eine benutzerdefinierte Klasse DrawableRectangle (zum Beispiel) erstellen mit einem Verfahren Unentschieden:

public class DrawableRectangle extends Rectangle { 

    Canvas theCanvas; 

    public DrawableRectangle(Rectangle r, Canvas c){ 
     super(r.getX(),r.getY(),r.getWidth(),r.getHeight()); 
     this.theCanvas = c; 
    } 
    public DrawableRectangle(int x, int y, int w, int h, Canvas c){ 
     super(x,y,w,h); 
     this.theCanvas = c; 
    } 

    public void draw(){ 
     GraphicsContext gc = theCanvas.getGraphicsContext2D(); 
     gc.setFill(Paint.valueOf("black")); 
     gc.fillRect(getX(),getY(),getWidth(),getHeight()); 
    } 

} 

die Sie dann wie folgt verwenden können:

GraphicsContext gc = theCanvas.getGraphicsContext2D(); 
    DrawableRectangle rect = new DrawableRectangle(10,10,20,20, theCanvas); 

    // Draw it: 
    rect.draw(); 

    // You can then manipulate it: 
    rect.setY(40); 
    rect.setHeight(60); 

    // You need to draw it again to see the changes: 
    // First clear the canvas: 
    gc.clearRect(0,0,theCanvas.getWidth(),theCanvas.getHeight()); 
    // Then draw it: 
    rect.draw(); 

(ich kann nicht garantieren, dies ist die beste Methode, aber es funktioniert gut für mich.Wenn Sie verschiedene Formen auf diese Weise zeichnen möchten, sollten Sie eine Schnittstelle Drawable, um es zu abstrahieren.)

+0

Vielen Dank für Ihre Antwort. Aber ich muss dieses Rechteck mit der Maus ziehen und dieses Rechteck muss mit seiner ID in meinem Projekt gespeichert werden. Wie funktioniert es auf der Leinwand? oder wenn ich keine Leinwand verwende, was wird mein Nachteil sein? Ich werde später mehr Formen brauchen, nicht nur ein Rechteck. – mbcrb

+0

Entschuldigung, ich sehe nur deinen Kommentar jetzt, weiß nicht, ob ich noch helfen kann. Sie können das Rechteck bearbeiten (z. B. durch Ziehen und Ablegen), indem Sie der DrawableRectangle-Klasse Ereignishandler hinzufügen. Sie sollten wahrscheinlich höhere APIs als Canvas verwenden, z. B. https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/package-summary.html – Gloomy