Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx画布内容消失_Java_User Interface_Javafx 8 - Fatal编程技术网

Javafx画布内容消失

Javafx画布内容消失,java,user-interface,javafx-8,Java,User Interface,Javafx 8,我试图将使用2-opt-change算法解决旅行商问题的过程形象化,但有时似乎程序的执行被卡住,窗口冻结,没有任何错误。 有时甚至画布上的线条也消失了 来点帮助就好了 以下是图纸代码: int numCities = getNumOfCities(); Order currentOrder = data.getCurrentOrder(); if (newValue) { GraphicsContext gc = canvasCiti

我试图将使用2-opt-change算法解决旅行商问题的过程形象化,但有时似乎程序的执行被卡住,窗口冻结,没有任何错误。 有时甚至画布上的线条也消失了

来点帮助就好了

以下是图纸代码:

 int numCities = getNumOfCities();
        Order currentOrder = data.getCurrentOrder();
        if (newValue) {
            GraphicsContext gc = canvasCities.getGraphicsContext2D();
            gc.clearRect(0, 0, canvasCities.getWidth(), canvasCities.getHeight());
            gc.setStroke(new Color(0, 0, 0, 1));
            gc.setLineWidth(1);
            gc.setFill((Color.GRAY));
            for (int i = 0; i < currentOrder.getSize(); i++) {
                City current = data.getCities()[currentOrder.getValue(i)];
                City next;
                if ((i + 1) > numCities - 1) {
                    next = data.getCities()[currentOrder.getValue(0)];
                } else {
                    next = data.getCities()[currentOrder.getValue(i + 1)];
                }



                gc.fillOval(current.getX() - 5, current.getY() - 5, 10, 10);
                gc.strokeLine(current.getX(), current.getY(), next.getX(), next.getY());

            }

            if(!(data.getBestEver()==null)) {
                Order best = data.getBestEver();
                gc.setStroke(new Color(1, 0, 0, 1));
                gc.setLineWidth(3);
                gc.setFill((Color.GRAY));
                for (int i = 0; i < best.getSize(); i++) {
                    City current = data.getCities()[best.getValue(i)];
                    City next;
                    if ((i + 1) > numCities - 1) {
                        next = data.getCities()[best.getValue(0)];
                    } else {
                        next = data.getCities()[best.getValue(i + 1)];
                    }


                    gc.fillOval(current.getX() - 5, current.getY() - 5, 10, 10);
                    gc.strokeLine(current.getX(), current.getY(), next.getX(), next.getY());

                }
            }
            repaint.set(false); //boolean that indicated if something changed and a repaint is necessairy
        }
int numCities=getNumOfCities();
Order currentOrder=data.getCurrentOrder();
如果(新值){
GraphicsContext gc=canvasCities.getGraphicsContext2D();
gc.clearRect(0,0,canvasCities.getWidth(),canvasCities.getHeight());
gc.设定行程(新颜色(0,0,0,1));
gc.设置线宽(1);
gc.setFill((颜色.灰色));
对于(int i=0;inumCities-1){
next=data.getCities()[currentOrder.getValue(0)];
}否则{
next=data.getCities()[currentOrder.getValue(i+1)];
}
gc.fillOval(current.getX()-5,current.getY()-5,10,10);
strokeLine(current.getX(),current.getY(),next.getX(),next.getY());
}
如果(!(data.getBestEver()==null)){
Order best=data.getBestEver();
gc.设定行程(新颜色(1,0,0,1));
gc.设置线宽(3);
gc.setFill((颜色.灰色));
for(int i=0;inumCities-1){
next=data.getCities()[best.getValue(0)];
}否则{
next=data.getCities()[best.getValue(i+1)];
}
gc.fillOval(current.getX()-5,current.getY()-5,10,10);
strokeLine(current.getX(),current.getY(),next.getX(),next.getY());
}
}
repaint.set(false);//布尔值,指示是否有更改,是否需要重新绘制
}
但有时,程序的执行似乎陷入了困境 窗口冻结,没有任何错误


JFX会消耗大量资源…尤其是画布和形状(例如递归组等),如果它被卡住,可能是“堆栈”处于溢出边缘。尝试使用-Xss[nnM],其中nn是任意数字,M代表兆字节。示例-Xss16M:为JFX线程使用16MB的堆栈。如果它的行为仍然“怪异”,那么将-Xss与-Xms组合(对于堆)。

问题在于多线程部分。在将绘制部分转换为可运行(使用
Platform.runLater()
调用)后,它可以正常工作


感谢所有花时间思考我的问题的人。

谢谢你的快速回答,但问题还是发生了。我尝试了-Xss1024M和-Xms1024M。我得到了一个BufferOverflowExceptionBufferOverflowBy1G堆栈有点太大了,不是吗?只需逐步增加8、16、32。。。MB我最近在SVG(可伸缩矢量图形)的渲染方面遇到了问题,其中“组”嵌套了32K次!我的应用程序静止不动。经过长时间的研究和试用,我的应用程序开始以8MB的堆栈运行。尝试一点后,我得到了一个BufferOverflowException和一个“java.lang.InternalError:Unrecognized PGCanvas token:67”。您好,SF23。如上所述,JFX画布和JFX形状(例如SVGPath、多边形等)消耗大量资源。此外:JFX的底层部分似乎与递归性密切相关,这使问题更加恶化。如果我有一个完整的部分代码,我可能能够重现问题,并有机会寻找解决方案。这段代码运行在哪个线程上?什么是
repaint
,将其设置为
false
会产生什么影响?代码由执行算法的线程运行<代码>重新绘制是一个可观察的布尔值,当设置为
true
时会触发重新绘制。将其设置为
false
可以进行下一次重新绘制。您不应该修改从JavaFX应用程序线程以外的线程显示的场景。(参见
Platform.runLater
)谢谢,这就是问题所在。现在它工作得很好。