JavaFX GraphicsContext.translate的意外行为

时间:2012-11-05 16:44:31

标签: canvas javafx-2

在探索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不允许新用户这样做):

Picture of the application output on my computer

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

注意:如果你在矩形绘画循环中注释掉graphics.beginPath(),那就更奇怪了......

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

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测试)

此致

0 个答案:

没有答案