2017-07-28 7 views
-1

J'ai besoin de dessiner une forme de beignet en utilisant GraphicsContext de JavaFX - un cercle rempli d'un trou au centre, pour clarifier.JavaFX - draw donut

J'ai cherché et je ne trouve aucun exemple en ligne.

Je pense que vous utiliseriez la fonction fillarc, mais je ne le comprends pas. Il n'y a pas d'exemples que j'ai pu trouver, et les docs n'aident pas beaucoup. (Qu'est-ce que arcExtent? Tous les docs disent que c'est l'étendue de l'arc ...)

Je ne veux pas remplir deux cercles qui se chevauchent, parce que je veux garder le centre transparent tout en dessinant. (J'ai déjà dessiné des choses en dessous, je ne peux pas interférer avec lui)

+0

Pourquoi les downvotes? Je ne trouve aucun exemple en ligne – MCMastery

+0

Parce que vous n'avez montré aucune tentative de code. – Eric

+0

@Eric j'ai édité la question – MCMastery

Répondre

1

Voici quelques exemples de solutions, l'une utilise shape subtraction pour les cercles, l'autre utilise un Arc. Les deux exemples utilisent le graphe de scène pour dessiner.

sample

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

public class DonutHole extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     // donut by shape subtraction. 
     Circle whole = new Circle(20, 20, 20); 
     Circle inside = new Circle(20, 20, 10); 
     Shape donutShape = Shape.subtract(whole, inside); 
     donutShape.setFill(Color.BLUE); 

     // donut by arc. 
     Arc donutArc = new Arc(60, 20, 10, 10, 0, 360); 
     donutArc.setStrokeWidth(10); 
     donutArc.setStrokeType(StrokeType.OUTSIDE); 
     donutArc.setStroke(Color.RED); 
     donutArc.setStrokeLineCap(StrokeLineCap.BUTT); 
     donutArc.setFill(null); 

     Scene scene = new Scene(new Group(donutShape, donutArc), Color.PALEGREEN); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Une solution alternative pourrait également utiliser un Path avec des segments d'arc et de ligne, mais je ne montre pas ici. Si vous vouliez un donut 3D, vous pouvez créer un Torus.


Voici un autre exemple qui utilise fillArc dans un GraphicsContext.

fill

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.canvas.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

public class DonutHoleGraphics extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     Canvas canvas = new Canvas(40, 40); 

     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setLineWidth(10); 
     gc.setStroke(Color.YELLOW); 
     gc.setLineCap(StrokeLineCap.BUTT); 
     gc.strokeArc(5, 5, 30, 30, 0, 360, ArcType.OPEN); 

     Scene scene = new Scene(new Group(canvas), Color.PALEGREEN); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

connexes:

+0

Merci! Cependant, j'ai besoin d'utiliser 'GraphicsContext' ... Je ne vois pas de méthode pour remplir une forme donnée, aussi je ne vois pas comment, en tapant un arc (pour votre seconde méthode) je peux définir une épaisseur en utilisant 'GraphicsContext' – MCMastery

+0

En fait, je l'ai trouvé:' ctx.setLineWidth'. Merci! J'ai utilisé la deuxième méthode – MCMastery