在探索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中使用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测试)
此致