在Apache Batik中刷新/重绘SVG

时间:2013-06-20 14:42:10

标签: java multithreading svg batik

我正在使用 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非常不熟悉。也许你可以帮助我?

谢谢!

0 个答案:

没有答案