我正在使用Apache Batik加载、操作和渲染 SVG 图形以进行模拟。到目前为止,加载和操作都有效,至少在将 SVG 写入文件时是这样。还可以渲染和更新一次(!)。
为了操作 SVG,我创建了一个 org.w3c.dom.svg.SVGDocument 并使用 org.apache.batik.swing.JSVGCanvas 来显示它。
在操作部分,发生的情况是,例如通过更改“fill:#HEX_CODE”来检索和操作元素的“style”属性。
在加载由 IntelliJ 使用 GridLayoutManager (IntelliJ) 创建的 Java GUI 时,我能够渲染 SVG。基本上,其中有一个表单、一个主面板和一个可视化面板。面板都是 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);
}
“可运行”变量在 View 的构造函数中定义如下:
runnable = new Runnable() {
@Override
public void run() {
simulatorView.getSvgCanvas().repaint();
}
};
我对 Java 中的线程以及复杂的 GUI 非常陌生。也许你能帮帮我?
谢谢 !