2016-04-03 46 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(); 
} 

當我在電腦上這樣做時,我只會看到一個藍色圓圈。沒有裁剪。有人可能會期望一個圓圈的四分之一和一個圓圈的藍色四分之一。不。取消註釋保存和恢復調用,並按預期行事。