更新用于高速操作的JavaFX2 gui的最佳方式是什么?

我有一个应用程序正在通过串口与硬件设备通信。该设备每30ms发送一个json对象。这个json对象是设备“状态”它的运动控制器。更新用于高速操作的JavaFX2 gui的最佳方式是什么?

基本上的消息是这样的:

{"sr":{"line":2524,"posx":1.000,"posy":21.000,"posz":20.000,"posa":11.459,"feed":0.000,"vel":0.000,"unit":1,"coor":1,"dist":0,"frmo":0,"momo":0,"stat":2}} 

我得到这些1X每30毫秒。我必须解析它们。然后将它们“绘制”到JavaFX gui上。

这里是我很解析:

Platform.runLater(new Runnable() { 

public void run() {

//We are now back in the EventThread and can update the GUI

try {

JsonRootNode json = JDOM.parse(l);

xAxisVal.setText(json.getNode("sr").getNode("posx").getText());

yAxisVal.setText(json.getNode("sr").getNode("posy").getText());

zAxisVal.setText(json.getNode("sr").getNode("posz").getText());

aAxisVal.setText(json.getNode("sr").getNode("posa").getText());

drawLine();

} catch (argo.saj.InvalidSyntaxException ex) {

//Json line invalid.

}

}

});

这里是我使用的抽奖代码:

public void drawLine() { 

xl.setX(Float.parseFloat(xAxisVal.getText()) + 400);

y1.setY(Float.parseFloat(yAxisVal.getText()) + 400);

LineTo tmpL = new LineTo((Float.parseFloat(xAxisVal.getText()) * 2) + 400, (Float.parseFloat(yAxisVal.getText()) * 2) + 400);

path.getElements().add(tmpL);

}

所以基本上我创建一个Runnable对象每30毫秒然后分析和绘图。这是做这件事的最好方法吗?你可以看到它的视频在行动:

http://www.youtube.com/watch?v=dhBB3QcmHOg&feature=youtu.be

但好像它的“干”和漂亮的耗资源。我希望有人就如何优化此代码给我提供建议?也许指出我缺少的东西?

作为供参考我们正在制作的运动控制器板称为TinyG。其开源硬件。
更多信息是在这里: http://www.synthetos.com/wiki/index.php?title=Projects:TinyG

固件在这里: https://github.com/synthetos/TinyG

谢谢!

回答:

您似乎对事件队列执行了太多计算,这些事件队列会在解析数据时阻止图形渲染。你应该在单独的线程计算,并呼吁Platform.runLater()只对相关的UI代码:

try { 

JsonRootNode json = JDOM.parse(l);

final String xVal = json.getNode("sr").getNode("posx").getText();

final String yVal = json.getNode("sr").getNode("posy").getText();

final String zVal = json.getNode("sr").getNode("posz").getText();

final String aVal = json.getNode("sr").getNode("posa").getText();

// here you are calling UI getter, and parse it each time

// it would be more optimal to store `x` value in separate variable

// between updates

final float x = Float.parseFloat(xAxisVal.getText());

final float y = Float.parseFloat(yAxisVal.getText());

Platform.runLater(new Runnable() {

public void run() {

//We are now back in the EventThread and can update the GUI

try {

xAxisVal.setText(xVal);

yAxisVal.setText(yVal);

zAxisVal.setText(zVal);

aAxisVal.setText(aVal);

xl.setX(x + 400);

y1.setY(y + 400);

LineTo tmpL = new LineTo(x * 2 + 400, y * 2 + 400);

path.getElements().add(tmpL);

}

}

}

} catch (argo.saj.InvalidSyntaxException ex) {

//Json line invalid.

}

回答:

如果你还没有,请尝试developer preview release。 JavaFX 2.1预览分支对smooth animation and rendering performance进行了一些修改,并优化了path logic。

另一种方法是在WebView中写入HTML5画布,或在JavaFX 2.2中有一个可用的时候使用JavaFX canvas node。

以上是 更新用于高速操作的JavaFX2 gui的最佳方式是什么? 的全部内容, 来源链接: utcz.com/qa/266715.html

回到顶部