JavaFX 8 strokeText意外行为

时间:2015-07-13 19:48:16

标签: canvas text javafx rendering

strokeText使用setLineWidth作为笔划的宽度。如果我将lineWidth设置为0.0但是(期望笔划为0.0,即根本没有笔划),它实际上使用先前设置的lineWidth来剪切文本。因此,尽管有一个显式的gc.setLineWidth(0.0);,但是会忽略笔划值并使用之前设置的内容。这是一个例子:

    Canvas fieldCanvas = new Canvas(400, 400);
    gc = fieldCanvas.getGraphicsContext2D();    

    gc.setFill(Color.YELLOW); 
    gc.setStroke(Color.RED);
    gc.setLineWidth(10.0);   

    gc.fillRect(50, 50, 350, 150);
    gc.strokeRect(50, 50, 350, 150);

    gc.setFont(Font.font("Arial", 100));                
    gc.setFill(Color.GREEN);
    gc.setStroke(Color.BLACK);        
    gc.setLineWidth(0.0);                               

    gc.fillText("TEST", 100, 160);
    gc.strokeText("TEST", 100, 160);

这将使文本值为10.0

JAVA FX8文档规定:将忽略范围(0,+ inf)之外的无限或非正值,并且当前值将保持不变。

但这似乎也包括0本身。所以任何值都必须> 0不是== 0。

文件应该更清楚还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

文档可以更清晰,它意味着独家范围。这是当前的实现:

 * Sets the current line width.
 * 
 * @param lw value in the range {0-positive infinity}, with any other value 
 * being ignored and leaving the value unchanged.
 */
public void setLineWidth(double lw) {
    // Per W3C spec: On setting, zero, negative, infinite, and NaN
    // values must be ignored, leaving the value unchanged
    if (lw > 0 && lw < Double.POSITIVE_INFINITY) {

正如评论所暗示的那样,这似乎遵循Canvas规范,其行为相同,您可以在浏览器中尝试类似的东西 -

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.lineWidth = 30;
ctx.lineWidth = 0;
ctx.strokeRect(20, 20, 80, 100);

这给你一个胖矩形。