我正在使用 Apache Batik 来加载,操作和渲染SVG图形以进行模拟。 到目前为止,加载和操作工作,至少在将SVG写入文件时。还可以渲染和更新ONCE(!)。
为了操作SVG,我正在创建一个org.w3c.dom.svg.SVGDocument并显示它我使用的是org.apache.batik.swing.JSVGCanvas。
在操纵部分,会发生什么,例如例如,元素的“style”属性被检索和操纵。更改“填充:#HEX_CODE”。
我可以使用GridLayoutManager(IntelliJ)加载IntelliJ创建的Java GUI时呈现SVG。基本上,有一个Form,一个mainPanel和一个可视化面板。面板都是JPanel类型。可视化面板包含我的JSVGCanvas类型的svgCanvas。
为了触发操作并刷新画布,我创建了一个按钮。单击该按钮时,svgDocument将更改并在画布中正确刷新。
现在的问题是:如何连续多次执行此操作?想法是每秒更改颜色并在操作后重新绘制/刷新画布。它似乎不适用于Thread.sleep(1000);
这是我单击按钮时触发的runSimulation()方法:
public void runSimulation() {
Element bodyElement = svgDocument.getElementById("body_");
String bodyStyleAttribute = bodyElement.getAttribute("style");
String saturationHexColor = "";
String newBodyStyleAttribute = "";
saturationHexColor = simulationDataModel.getSaturationHexColor(70);
newBodyStyleAttribute = bodyStyleAttribute.substring(0, bodyStyleAttribute.lastIndexOf("fill:#")) + "fill:#" + saturationHexColor + bodyStyleAttribute.substring(bodyStyleAttribute.lastIndexOf("fill:#") + "fill:#".length() + 6);
svgDocument.getElementById("body_").setAttribute("style", newBodyStyleAttribute);
simulatorView.getSvgCanvas().getUpdateManager().getUpdateRunnableQueue().invokeLater(runnable);
}
“runnable”变量在View的构造函数中定义如下:
runnable = new Runnable() {
@Override
public void run() {
simulatorView.getSvgCanvas().repaint();
}
};
我对Java中的线程以及复杂的GUI非常不熟悉。也许你可以帮助我?
谢谢!