2016-04-03 44 views
0

这可能是最简单的问题。我有一个JavaFX Canvas设置是这样的:删除GraphicsContext剪辑

Canvas canvas = new Canvas(300, 300); 
    GraphicsContext context = canvas.getGraphicsContext2D(); 

    // make a big rectangle 
    context.setFill(Color.BLUE); 
    context.fillRect(50, 50, 200, 200); 

    // clip 
    context.beginPath(); 
    context.rect(100, 100, 100, 100); 
    context.closePath(); 
    context.clip(); 

    // so now this draws a clipped smaller rectangle 
    context.setFill(Color.RED); 
    context.fillRect(50, 50, 200, 200); 

    context.removeClip(); // ??? 

    // remove clip so this white rectangle is shown 
    context.setStroke(Color.WHITE); 
    context.setLineWidth(3); 
    context.strokeRect(75, 75, 150, 150); 

我试图GraphicsContext#restore()(用于恢复一切,但剪裁,创造一个矩形路径从0开始| 0和与画布的大小,并再次呼吁clip()

如何删除从GraphicsContext

+1

我不使用画布很多,所以我不确定这个,但它看起来像['context.restore()'](http://docs.oracle.com/javase/8/javafx/ api/javafx/scene/canvas/GraphicsContext.html#restore--)应该删除剪辑。在调用'clip()'之前,您可能需要/希望调用'context.save()'来保留一些其他值,这些值将由'restore()'回滚。 –

+0

事实上,你必须先调用save(),然后才能调用restore()。这来自还原方法的文档。 “如果堆栈是空的,则不会改变。” – mipa

回答

2

JavaFX中的剪裁行为是很难的,至少可以说剪裁。这个“删除裁剪你说什么?”如何。

public void start(Stage primaryStage) throws Exception { 
    Pane root = new Pane(); 
    Canvas canvas = new Canvas(); 
    canvas.setHeight(400); 
    canvas.setWidth(400); 

    GraphicsContext graphics = canvas.getGraphicsContext2D(); 
    //graphics.save(); 
    graphics.beginPath(); 
    graphics.rect(0,0,200,200); 
    graphics.clip(); 
    graphics.setFill(Color.RED); 
    graphics.fillOval(100, 100, 200, 200); 

    //graphics.restore(); 
    graphics.beginPath(); 
    graphics.rect(200,200,200,200); 
    graphics.clip(); 

    graphics.setFill(Color.BLUE); 
    graphics.fillOval(100, 100, 200, 200); 

    root.getChildren().add(canvas); 
    Scene scene = new Scene(root, 400, 400); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

当我在电脑上这样做时,我只会看到一个蓝色圆圈。没有裁剪。有人可能会期望一个圆圈的四分之一和一个圆圈的蓝色四分之一。不。取消注释保存和恢复调用,并按预期行事。