以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 SVG/GML/VRML/X3D/XAML 』  (http://bbs.xml.org.cn/list.asp?boardid=21)
----  Batik 入门(五)[转帖]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=21&rootid=&id=44731)


--  作者:supremeweb
--  发布时间:4/2/2007 1:52:00 PM

--  Batik 入门(五)[转帖]
Batik Swing 组件

Batik Swing 组件模块的目标是提供一个可以用来显示SVG documents的Swing组件。使用JSVGCanvas类,你可以非常容易的显示一个SVGdocument(从一个URI或者一个DOM树中)并且允许用户来操作他,比如旋转,缩放,panning,选择文本或者激活链接。首先这个文档将解析如何去创建JSVGCanvas并且将它与一个Swing应用程序整合到一起。然后,描述一些先进的特性,比如用来跟踪所有在显示或者执行一个svg文档时发生的事件。

创建一个JSVGCanvas

下面的实例将解析如何创建一个符合Swing设计规则的Swing组件----JSVGCanvas。这意味着组件不具备线程安全并且在组件上的所有操作或者它显示的所有文档必须像在Swing指南中描述的那样执行。JSVGCanvas是一个javabeans,所以它可以在可视化应用程序构造器中使用。

注意

如果你要尝试这个例子,别忘了设置你的CLASSPATH以便它包含Batik类和资源,比如Xerces(lib/xerces_2_5_0.jar)和XML APIs jars(lib/xml-apis.jar 和lib/xml-apis-ext.jar).

import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;

public class SVGApplication {

    public static void main(String[] args) {
        // Create a new JFrame.
        JFrame f = new JFrame("Batik");
        SVGApplication app = new SVGApplication(f);

        // Add components to the frame.
        f.getContentPane().add(app.createComponents());

        // Display the frame.
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setSize(400, 400);
        f.setVisible(true);
    }
    
    // The frame.
    protected JFrame frame;

    // The "Load" button, which displays up a file chooser upon clicking.
    protected JButton button = new JButton("Load...");

    // The status label.
    protected JLabel label = new JLabel();

    // The SVG canvas.
    protected JSVGCanvas svgCanvas = new JSVGCanvas();

    public SVGApplication(JFrame f) {
        frame = f;
    }

    public JComponent createComponents() {
        // Create a panel and add the button, status label and the SVG canvas.
        final JPanel panel = new JPanel(new BorderLayout());

        JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
        p.add(button);
        p.add(label);

        panel.add("North", p);
        panel.add("Center", svgCanvas);

        // Set the button action.
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser fc = new JFileChooser(".");
                int choice = fc.showOpenDialog(panel);
                if (choice == JFileChooser.APPROVE_OPTION) {
                    File f = fc.getSelectedFile();
                    try {
                        svgCanvas.setURI(f.toURL().toString());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });

        // Set the JSVGCanvas listeners.
        svgCanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
            public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
                label.setText("Document Loading...");
            }
            public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
                label.setText("Document Loaded.");
            }
        });

        svgCanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
            public void gvtBuildStarted(GVTTreeBuilderEvent e) {
                label.setText("Build Started...");
            }
            public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
                label.setText("Build Done.");
                frame.pack();
            }
        });

        svgCanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
            public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
                label.setText("Rendering Started...");
            }
            public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
                label.setText("");
            }
        });

        return panel;
    }
}

按此在新窗口浏览图片

这些监视器给与了这五个阶段(包括错误状态)的不同步骤的完整描述。 适配器类对于灵活创建新的舰艇器执行----- SVGDocumentLoaderAdapter, GVTTreeBuilderListenerAdapter, SVGLoadEventDispatcherAdapter, GVTTreeRendererAdapter 和UpdateManagerAdapter是可用的。

对于静态文档, 你可以假定JSVGCanvas 在gvtRenderingCompleted方法调用被调用时已经完成了它的工作 (解析, 构建和描绘) 。

在动态文档的情况下, 计算完成(parsing, building, SVGLoad dispatch, initial rendering and updates) 通过调用 updateManagerStopped 方法被标记.

添加交互

JSVGCanvas 提供一系列内部构造交互,这些交互允许用户操作显示文档,包括缩放,平移和旋转. 交互捕捉用户输入到 JSVGCanvas组件中并且 将它们转化为行为. 如果你要添加一个新的行为到JSVGCanvas中, 你可以执行 Interactor 接口. 然后你可以通过添加新的元素到通过canvas的个体Interactors()方法返回的list中注册新的交互到组件中。



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
8,003.906ms