3

在探索 JavaFX Canvas 组件的功能时,我在使用该translate(double,double)方法时遇到了一个非常奇怪的行为:

当我在调用该translate方法后描边或填充路径时,路径被画得不合适。translate在下面的示例中,路径的移动似乎是我在方法中指定的三倍。然而,抚摸文本似乎将文本绘制在我期望的位置。(在 Linux 和 Windows 64 位上观察到此行为)

由于我是 JavaFX 和 Canvas 的新手,我不确定这是否是 JavaFX 运行时中的错误,或者我只是以错误的方式使用了该库。有人能指出我正确的方向吗?

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TestApplication extends Application
{
  public static void main( String[] args )
  {
    launch(args);
  }

  @Override
  public void start(Stage stage) throws Exception
  {
    Canvas canvas = new Canvas(500,500);
    paint(canvas.getGraphicsContext2D(), canvas.getWidth());

    GridPane root = new GridPane();
    root.add(canvas, 0, 0);

    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();
  }

  private void paint(GraphicsContext graphics, double width)
  {
    //Paint ruler lines on top
    for ( int xCoord = 0; xCoord < width; xCoord+=10 ) {
      graphics.setStroke(Color.RED);
      graphics.beginPath();
      graphics.moveTo(xCoord, 0);
      graphics.lineTo(xCoord, 10);
      graphics.stroke();
    }

    //Paint rectangles and text
    for ( int xCoord = 0; xCoord < width; xCoord+=10 ) {
      graphics.translate(10, 10);

      graphics.setStroke(Color.BLACK);
      graphics.beginPath();
      graphics.rect(0, 0, 300, 300);
      graphics.stroke();

      graphics.strokeText(String.valueOf(xCoord), 0, 0);
    }
  }
}

上面的应用程序应该显示一个带有画布的窗口。画布内部应该有 50 个矩形,每个矩形应相对于前一个矩形在 x 和 y 方向上位移 10 个像素。在矩形顶部,绝对位移值应显示为字符串。在画布的顶部,我画了一个“尺子”来检查 10 像素的宽度。当我在计算机上运行此示例时,第一个矩形从 30,30 开始,第二个矩形从 60,60 开始,依此类推。但是数字显示在正确的位置。请看下面的图片(对不起,不能使用内联图片,因为stackoverflow不允许新用户这样做):

我的电脑上应用程序输出的图片

有人有同样的问题吗?或者我做错了什么?任何帮助将不胜感激。

注意:graphics.beginPath()如果您在矩形绘制循环中注释掉,它会变得更加奇怪......

更新:正如评论中所指出的,在graphics.closePath()我抚摸路径之前,我已经尝试过打电话。不幸的是,这似乎并没有改变任何东西。另请注意,使用方法graphics.strokeRect()而不是beginPath,rect[,closePath],stroke组合,输出是正确的(如预期的那样)

UPDATE2:由于 GraphicsContext API 似乎基于 HTML5 Canvas API,我已将上面的代码转换为 HTML5/Canvas 以查看会发生什么。在我的 Firefox 浏览器中运行它,转换后的代码的结果符合预期(不会像 JavaFX那样显示奇怪的行为)。

我还尝试使用 GraphicsContext API 中的strokePolylinestrokePolygon方法。使用下面的代码,路径的移动/翻译“仅”是预期的两倍。

double xCoords[] = { 0, 300, 300,   0,0 };
double yCoords[] = { 0,   0, 300, 300,0 };

graphics.strokePolyline(xCoords, yCoords, xCoords.length);

我真的开始觉得这确实是 JavaFX 运行时中的一个错误。

UPDATE3:我已向 JavaFX JIRA 系统提交了错误报告:RT-26119。收到 JavaFX 团队的反馈后,我会尽快用答案更新这个问题。

UPDATE4:这个问题似乎在 jdk 1.8.0 早期访问版本中得到解决(用 b71 测试)

问候

4

0 回答 0