在探索 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 中的strokePolyline
和strokePolygon
方法。使用下面的代码,路径的移动/翻译“仅”是预期的两倍。
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 测试)
问候