batik入門記その7 〜Scripting With Java編〜

さっそくお目当てのScriptingをやってみる。まずはどかっと必要なもんをゲットしておいて、どんっとリスナを登録する。

    // Forces the canvas to always be dynamic even if the current
        // document does not contain scripting or animation.
        canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
        canvas.addSVGLoadEventDispatcherListener
            (new SVGLoadEventDispatcherAdapter() {
                    public void svgLoadEventDispatchStarted
                        (SVGLoadEventDispatcherEvent e) {
                        // At this time the document is available...
                        document = canvas.getSVGDocument();
                        // ...and the window object too.
                        window = canvas.getUpdateManager().
                            getScriptingEnvironment().createWindow();
                        // Registers the listeners on the document
                        // just before the SVGLoad event is
                        // dispatched.
                        registerListeners();
                        // It is time to pack the frame.
                        frame.pack();
                    }
                });

リスナの登録はこんな感じ。

  public void registerListeners() {
        // Gets an element from the loaded document.
        Element elt = document.getElementById("elt-id");
        EventTarget t = (EventTarget)elt;

        // Adds a 'onload' listener
        t.addEventListener("SVGLoad", new OnLoadAction(), false);

        // Adds a 'onclick' listener
        t.addEventListener("click", new OnClickAction(), false);
    }

でサンプルをそのままコピペで動作確認。ちゃんと動くのだろうか…うん、ちゃんと動いた。よーわからんのが、イベントの登録名。onloadは”SVGLoad”、onclickは”click”。ってことでonmouseoverを”mouseover”で登録したら動いた。これってSVGの仕様できまってんのかな?んでちょっと調べたらマウスイベントが定義してあった(てかDOMのお話)。

  • click
  • mousedown
  • mouseup
  • mouseover
  • mousemove
  • mouseout

んでUserAgent(また出た…)とやらは次のイベントをサポートしないといけないらしい。

  • SVGLoad
  • SVGUnload
  • SVGAbort
  • SVGError
  • SVGResize
  • SVGScroll

やばっ、この辺てbatikが勝手に実装してるのかと思ったらSVGの仕様で決まってたのね。いかん、SVGの仕様ってちゃんと読んでなかった。仕様の理解は大前提のはずだったのに、ついつい動くものの方へ走ってしまった。

そしてtextエレメントにonclickを設定して文字列が動的に変更できることを確認した。後はGUIから何か要素を追加したい場合にどうするかだな。文字の書き込みとかどないしょ?DOMに追加すればいいんだろうけど、DOMってあんまり使ったことないからその辺から勉強しなおした方がはやいのかな。