2013-05-29 83 views
5

在javafx畫布中進行徒手畫時,我無法獲得anitialiazed線條。 以下是代碼...畫布不能畫出流暢的線條

import javafx.application.*; 
import javafx.event.*; 
import javafx.scene.*; 
import javafx.scene.canvas.*; 
import javafx.scene.control.*; 
import javafx.scene.input.*; 
import javafx.scene.shape.*; 
import javafx.stage.*; 

public class Test2 extends Application { 
    GraphicsContext gc; 

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

    private class MouseDragged implements EventHandler<MouseEvent> { 
     public void handle(MouseEvent e) { 
     gc.lineTo(e.getX(), e.getY()); 
     gc.stroke(); 
     } 
    } 

    private class MousePressed implements EventHandler<MouseEvent> { 
     public void handle(MouseEvent e) { 
     gc.moveTo(e.getX(), e.getY()); 
     } 
    } 

    @Override 
    public void start(Stage stage) { 
    Canvas canvas = new Canvas(500, 500); 
    canvas.setOnMouseDragged(new MouseDragged()); 
    canvas.setOnMousePressed(new MousePressed()); 

    gc = canvas.getGraphicsContext2D(); 
    gc.setLineCap(StrokeLineCap.ROUND); 
    gc.setLineJoin(StrokeLineJoin.ROUND); 
    gc.setLineWidth(0.1); 

    Group root = new Group(canvas); 
    Scene scene = new Scene(root); 
    stage.setTitle("Test2"); 
    stage.setScene(scene); 
    stage.show(); 
    } 
} 

而如果我創建了一個Swing應用程序,我可以提供呈現提示,以平滑出來...

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

如何提供渲染命中圖形上下文在畫布上?

+0

針對[JavaFX問題跟蹤器](https://javafx-jira.kenai.com)登錄功能請求 – jewelsea

+0

舊的JavaFX問題跟蹤器鏈接已死亡。功能要求可以記錄在http://bugreport.java.com(我認爲),儘管如果你在[openjfx-dev郵件列表](http:// mail.openjdk.java.net/mailman/listinfo/openjfx-dev),然後記錄下來。 – jewelsea

+0

請注意,這裏的實際問題可能會多次繪製相同的點,這會使反鋸齒線顯示爲別名。看到相關的問題:[如何應用反鋸齒javafx方法像GraphicsContext.fillArc()?](https://stackoverflow.com/questions/34148521/how-to-apply-antialiasing-to-javafx-methods-like-graphicscontext -fillarc) – jewelsea

回答

3

嘗試增加這個效果你GraphicsContext

BoxBlur blur = new BoxBlur(); 
blur.setWidth(1); 
blur.setHeight(1); 
blur.setIterations(1); 
gc.setEffect(blur); 

所以(舉例來說)你start方法現在看起來是這樣的:

@Override 
    public void start(Stage stage) { 
    Canvas canvas = new Canvas(500, 500); 
    canvas.setOnMouseDragged(new MouseDragged()); 
    canvas.setOnMousePressed(new MousePressed()); 

    gc = canvas.getGraphicsContext2D(); 
    gc.setLineCap(StrokeLineCap.ROUND); 
    gc.setLineJoin(StrokeLineJoin.ROUND); 
    gc.setLineWidth(1); 

    BoxBlur blur = new BoxBlur(); 
    blur.setWidth(1); 
    blur.setHeight(1); 
    blur.setIterations(1); 
    gc.setEffect(blur); 

    Group root = new Group(canvas); 
    Scene scene = new Scene(root); 
    stage.setTitle("Test2"); 
    stage.setScene(scene); 
    stage.show(); 
    } 

這不完全完美......但迄今爲止我發現的最好的東西。

+0

不錯的選擇。但爲了這個目的,我想我會堅持一段時間。沒有bufferedimage的靈活性,我不能做的事情很少。 – Bhupen