JavaFX画布重画不';我什么也不做

JavaFX画布重画不';我什么也不做,java,javafx,canvas,redraw,Java,Javafx,Canvas,Redraw,我有一张画布,在上面我在一个特定的位置画一架飞机(第一张画很好)。当我的程序运行时,我需要从另一台服务器采样飞机位置,并相应地更新我的飞机位置 一切正常(参数方面),除了没有被重新绘制 编辑:更正-在原始飞机的顶部绘制了一个小污点,然后什么也没有发生 我的代码: public class AirplaneDrawer extends Canvas{ double x,y,rotate; public void setCords(double x,double y,double

我有一张画布,在上面我在一个特定的位置画一架飞机(第一张画很好)。当我的程序运行时,我需要从另一台服务器采样飞机位置,并相应地更新我的飞机位置

一切正常(参数方面),除了没有被重新绘制

编辑:更正-在原始飞机的顶部绘制了一个小污点,然后什么也没有发生

我的代码:

public class AirplaneDrawer extends Canvas{
    double x,y,rotate;

    public void setCords(double x,double y,double rotate) {
        if(x != this.x || y != this.y || rotate != this.rotate) {
            this.x = x;
            this.y = y;
            this.rotate = rotate;
            redraw();
        }
    }

    public void redraw() {
        GraphicsContext gc = getGraphicsContext2D();
        String path = new String("M 323.193 226.645 c 39.244 24.41 75.644 47.053 115.706 71.978 c 7.687 -5.443 20.518 -14.485 33.308 -23.596 c 16.733 -11.923 36.27 -11.452 49.046 3.779 c 3.513 4.191 2.568 15.766 -0.705 21.426 c -23.705 40.994 -48.427 81.404 -73.095 121.833 c -4.729 7.745 -9.06 19.278 -21.177 13.509 c -12.203 -5.8 -28.746 -9.521 -27.842 -28.026 c 0.891 -18.185 3.495 -36.292 4.924 -50.249 c -40.704 -19.793 -79.74 -38.778 -119.825 -58.269 c -16.168 17.561 -22.275 40.532 -27.606 64.119 c -8.975 39.719 -18.474 79.324 -28.171 118.881 c -5.593 22.809 -12.452 26.109 -34.167 17.908 c -28.122 -10.606 -31.047 -14.689 -31.318 -45.384 c -0.605 -68.198 -1.514 -136.4 -1.325 -204.593 c 0.045 -15.865 -4.177 -25.531 -19.237 -32.95 c -30.238 -14.884 -60.119 -30.866 -88.548 -48.915 c -13.988 -8.884 -26.951 -21.77 -35.867 -35.727 C 3.526 110.834 15.381 90.43 40.637 91.746 c 17.786 0.931 36.644 4.67 52.618 12.229 c 32.58 15.413 63.735 33.905 95.022 51.921 c 8.735 5.028 15.083 4.992 23.944 0.068 c 64.671 -35.921 129.717 -71.172 194.611 -106.705 c 25.712 -14.075 46.608 -10.335 65.331 12.008 c 10.309 12.302 2.247 20.797 -6.506 28.579 c -35.89 31.91 -72.438 63.093 -107.682 95.687 C 344.877 197.641 334.677 212.878 323.193 226.645 Z");
        double wid = getWidth()/247;
        double hei = getHeight()/152;
        gc.translate(wid*x,hei*y);
        gc.scale(0.02,0.02);    
        gc.rotate(rotate);
        gc.appendSVGPath(path);
        gc.setFill(Color.BLACK);
        gc.fill();
        gc.stroke();
    }
}

我想GraphicContext可能会记住最后一次缩放/平移/旋转,所以我尝试在
setCords
方法中的
if
中添加第二个
if
,如果这不是第一次绘制,则向后撤消这些步骤,但不会改变任何内容

编辑:如果我使用此条件,则我在前面的第一次编辑中提到的污迹不会出现,并且不会重新绘制任何内容

        if(this.x!=0 || this.y!= 0 || this.rotate != 0) {
            GraphicsContext gc = getGraphicsContext2D();
            double wid = getWidth()/247;
            double hei = getHeight()/152;
            gc.rotate(-this.rotate);
            gc.scale(50, 50);
            gc.translate(-wid*this.x,-hei*this.y);
        }
我做错了什么?(我已经调试并看到,
setCords
正在根据需要使用正确的参数进行调用)

注意:我不知道这是否重要,但是调用
setCords
是在一个单独的线程中进行的,因此我的程序将一如既往地继续

谢谢

你提到:

注意:我不知道这是否重要,但是调用
setCords
是在一个单独的线程中进行的,因此我的程序将一如既往地继续

这很重要。根据以下文件:

Canvas
仅包含一个
GraphicsContext
,以及一个缓冲区。如果它没有附加到任何场景,那么它可以被任何线程修改,只要一次只从一个线程使用它。将
Canvas
节点附加到场景后,必须在JavaFX应用程序线程上对其进行修改

GraphicsContext
上调用任何方法都被视为修改其相应的
Canvas
,并受相同的线程规则约束

如果您在后台线程上,则可以使用将操作发布到FX线程。但是,请注意不要用太多的操作淹没FX线程。您可能想考虑使用一个代替,或者可能与(使用适当的同步)结合使用一个单独的线程。
另外,请注意,在
画布上绘制不会清除以前绘制的任何内容。要模拟移动,您需要清除相应区域(或在其上绘制,例如背景),然后在不同位置重新绘制。这可以具体到只清除/绘制已更改的内容,也可以一般到每次重新绘制整个画布。

谢谢您的回答,我通过第二个线程使用
runLater
调用
setCords
,但它似乎没有改变任何东西。。发送到方法的参数仍然是正确的,但是画布上没有新的内容。。我还向代码中添加了
gc.clearRect(0,0,getWidth(),getHeight())
,但它没有清除任何内容(或者可能会清除,但只是在相同位置重新绘制),尝试创建一个演示问题的示例(与您当前拥有的代码片段相反),然后编辑您的问题。我们需要看看所有的东西是如何结合在一起的。注意:不要把你的整个项目都抛到这个问题上。试着用足够的代码从头开始创建示例来演示这个问题。“”链接提供了一些有用的提示。很抱歉,没有提供所需的所有详细信息,它似乎没有吸引力。虽然我在问题的根源上错了,但我会同意这一点,所以我打开了一个新问题哈哈,非常欢迎你查看:无关:不要使用
新字符串(…)
,只使用字符串文字。换句话说,使用
stringpath=“…”