java - Canvas 画不出流畅的线条

标签 java javafx-2 javafx antialiasing

在 javafx Canvas 中进行手绘时,我无法获得抗锯齿线。 以下是代码...

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 );

如何为 Canvas 中的图形上下文提供渲染命中?

最佳答案

尝试将此效果添加到您的 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();
  }

它并不完全完美……但这是迄今为止我发现的最好的东西。

关于java - Canvas 画不出流畅的线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16816558/

相关文章:

java - 在 JavaFX 中向菜单添加动态条目

java - Android - 如何从字符串资源中获取名称中包含两个或多个相似单词的所有元素

Java - 文件保存不起作用

java - 使用 JavaFX 将图像放置在 PDF 文件上

javafx 8 : How to update TreeCell in TreeView on SlectedItemProperty Change

Javafx:jpeg 文件存在,但 Image 构造函数抛出 IllegalArgumentException!为什么?

java - 如何使用 Spring 将 HttpSession 放入 Aspect 类中?

java - 向跨度字符串添加额外的文本可以消除我的粗体文本。

java - 在 java 和 csv 文件中设置 UTF-8

java - 如何将多个折线图放入一个场景/舞台?