gpt4 book ai didi

javafx-2 - 为高速操作更新 JavaFX2 gui 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 08:51:47 24 4
gpt4 key购买 nike

我有一个应用程序通过串口与硬件设备通信。此设备每 30 毫秒发送一个 json 对象。这个 json 对象是设备“声明”它的运动 Controller 。

消息基本上是这样的:

{"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}}

我每 30 毫秒获得 1 次。我必须解析它们。然后将它们“绘制”到 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);

}

所以基本上我每 30 毫秒创建一个可运行的对象,然后进行解析和绘制。这是最好的方法吗?您可以观看它的运行视频:

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

但它似乎“生涩”而且非常耗费资源。我希望有人给我关于如何优化这段代码的建议?也许指出我遗漏了什么?

仅供引用,我们正在制作的运动 Controller 板称为 TinyG。它的开源硬件。
更多信息在这里: http://www.synthetos.com/wiki/index.php?title=Projects:TinyG

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

谢谢!

最佳答案

您似乎在事件队列上执行了太多计算,这会在解析数据时阻止图形渲染。您应该在单独的线程中进行计算并仅针对相关的 ui 代码调用 Platform.runLater():

    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.
}

关于javafx-2 - 为高速操作更新 JavaFX2 gui 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9731015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com