更新用于高速操作的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