`
huibin
  • 浏览: 757165 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

SVG在Java application中的应用

    博客分类:
  • SVG
 
阅读更多

来源:CSDN(CSDN.NET)

1 前言

  SVG 作为一种开源的矢量绘图标准,应用越来越广泛。SVG与WEB应用程序的结合较为常见,开发也相当方便(IE + SVGView + Script)。那么SVG是否可以与Java Application程序结合呢?答案当然是肯定的。本文就是简要介绍SVG在Java Application上的应用方法。

2 SVG的插件包(batik)

  在浏览器上浏览SVG文件,需要安装SVG的插件,例如SVGView。在Java Application程序上也需要有SVG的插件包,如batik(http://xmlgraphics.apache.org/batik/)。该包是apache项目组的一个开源项目,该包解析了SVG中的大部分标签,可以为开发人员提供相当的空间,用来实现用户和SVG文件的交互。

3 Java Application画面技术的选择(SWING)

  用Java来做Application大致可用的技术有AWT、SWING、SWT等。这些技术
如何选择可以参考其他更权威的材料,我的开发经验也不多,无权发表意见。但就本文来讲,采用的技术是SWING。原因有以下方面:1、batik包本身使用 SWING技术实现的。2、据说SWING可以相对方便的移植到UNIX上(因为我们的项目需要在windows和UNIX上运行)。

4 用JSVGCanvas装载并显示SVG文件

  batik包中,主要用的一个类就是JSVGCanvas。该类相当于一个容器,用来装载并显示SVG文件。
如下代码来自于batik包的联机帮助。

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) {
        JFrame f = new JFrame("Batik");
        SVGApplication app = new SVGApplication(f);
        f.getContentPane().add(app.createComponents());
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setSize(400, 400);
        f.setVisible(true);
    }

    JFrame frame;
    JButton button = new JButton("Load...");
    JLabel label = new JLabel();
    JSVGCanvas svgCanvas = new JSVGCanvas();

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

     public JComponent createComponents() {
        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;
    }
}

  上述代码中svgCanvas.setURI(f.toURL().toString());用来装载并显示一个SVG文件。

5 获得SVG中的某个element(getElementById(""))

  经常要在程序中,对SVG中某个element的属性值进行改变,在改变之前当然要先获得这个element。SVGDocument提供了getElementByID()的方法。可以通过SVG中element的ID值获得该对象。
  例如:

import org.w3c.dom.*;
Element eIcName = svgCanvas.getSVGDocument().getElementByID(“icname”);

  接下来,获得的对象需要强制转换成SVG的元素。
  假设上述代码获得的是ID=“icname”的一个Group元素。即

<g id=”icname” display = "inline" >
……
</g>

  则转换代码:

import org.w3c.dom.svg.SVGGElement;
SVGGElement svggIcName = (SVGGElement)eIcName;

6 改变SVG中某个element的属性

  改变SVG中某个element的属性(setAttribute("属性名称","属性值")),获得了某个元素后,就可用setAttribute方法修改某个属性的值。例如将上述元素的display值由"inline"修改成"none"。

  代码:

svggIcName.setAttribute(“display”,”none”);

如果发现上述代码运行后,元素的属性变化并没有马上被表示。可以用下述代码试试。

import java.awt.geom.AffineTransform;
AffineTransform rat = svgCanvas.getRenderingTransform();
svggIcName.setAttribute("display","none");
svgCanvas.setRenderingTransform(rat);

7 监听SVG上某个element的鼠标事件

  鼠标在某个element上的事件,可以在两个地方监听到。一个是用JavaScript直接写在SVG文件中。另一个是用Java代码在application中监听。前一种方式比较简单,这里就不再描述,下面举例说明如何在application中监听鼠标事件。

import org.w3c.dom.Element;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import org.w3c.dom.svg.EventListenerInitializer;
import org.w3c.dom.svg.SVGDocument;

public class EventListenerInit implements EventListenerInitializer{
    public void initializeEventListeners(SVGDocument doc) {

            //JCT Windows SHOW
        ((EventTarget)doc.getElementById("testJCT")).
            addEventListener("click", new EventListener() {
                public void handleEvent(Event evt) {

                    ((Element)evt.getTarget()).setAttributeNS(null, "fill", "orange");
                    subwindws sw = new subwindws(evt);
                    sw.show();
                }
            }, false);
}
}

  在JavaApplication中需要定义一个类实现EventListenerInitializer接口,重写handleEvent方法。
上述代码就是监听"testJCT"这个element的鼠标单击事件,当事件被触发后弹出一个窗口(subwindws)。

8 在JavaScript中调用Application的方法

  SVG和JavaApplication的交互方式除了上述的以外,还可在SVG的脚本中调用JavaApplication的方法。
  例如在SVG的JavaScript脚本中添加如下代码:

importPackage(Packages.包名);

function fortest(){
         SVGApplication.svggeIcName.setAttribute("display","inline");
                       SVGApplication.svggeAll.setAttribute("transform","translate(0,0)");  
}

  本文属转载,原文链接:http://blog.csdn.net/yaoyuhang/archive/2006/06/29/850852.aspx

(THE END)

分享到:
评论

相关推荐

    java EE 7 & HTML5 应用开发——构建和部署同时支持桌面和移动设备的动态高性能企业级应用.rar

    Java EE 7与HTML5是现代企业级应用开发中的关键技术,它们的结合使得开发者能够构建出既适应桌面环境又能无缝支持移动设备的高性能应用程序。本文将深入探讨这两个技术领域,以及如何利用它们来创建动态且高效的企业...

    WPF 将 SVG 转 XAML 的工具.rar

    在本文中,我们将深入探讨如何使用WPF(Windows Presentation Foundation)将SVG(Scalable Vector Graphics)图形转换为XAML(Extensible Application Markup Language),这是一个在.NET Framework中用于构建用户...

    ApplicationList.zip

    "ApplicationList.zip" 是一个包含源代码文件的压缩包,主要针对Android应用开发。这个压缩包中的文件提供了关于...如果你想要深入了解Android应用开发,可以逐一研究这些文件,了解它们在构建和运行应用过程中的作用。

    java adf 中的maptips原理

    在Java ADF(Application Development Framework)环境中,MapTips是一种重要的用户交互功能,主要用于地图应用中为用户提供特定位置的详细信息。通过悬停或点击地图上的某个地理要素,MapTips能够即时显示该要素的...

    java毕设项目之基于java+springboot科研工作量管理系统的设计与实现.zip

    对于学习Java和SpringBoot的学生来说,这是一个很好的实践案例,有助于理解如何将理论知识应用于实际项目开发中。同时,该项目也覆盖了科研管理中的多个关键领域,对于提升科研管理效率具有实际意义。

    Android/CSS/HTML5/JAVA帮助文档下载

    Java API(Application Programming Interface)是Java开发的核心组成部分,它提供了大量的类库和接口,使得开发者能够快速构建应用程序。JDK_API6.0.CHM文件是Java Development Kit(JDK)6.0的API文档,包含了所有...

    JavaServer Pages 技术

    在例子中,`&lt;jsp:useBean id="locales" scope="application" class="MyLocales"/&gt;`创建了一个`MyLocales`实例,并将其保存在应用程序作用域中。 3. **Scriptlet**(`&lt;% ... %&gt;`):这是Java代码片段,可以直接在JSP...

    java图形图象处理(文档+系统).zip

    在Java中,图形图像处理主要依赖于Java 2D API(Application Programming Interface)和Java Advanced Imaging (JAI)库。这些工具集提供了一系列的类和方法,使得开发者能够实现复杂的图像操作,如绘制图形、渲染...

    第五章 Java代码解析shape压缩包上传

    在本章节中,我们将深入探讨Java编程语言在处理文件压缩,特别是上传shape压缩包方面的应用。Java作为一种广泛使用的编程语言,提供了丰富的API和工具来处理各种文件操作,包括压缩和解压缩。在这个主题中,我们将...

    【65】李兴华系列之Java8、Oracle、JavaScript、HTML5、Spring、Struts、Hibernate系列视频教程下载 .txt

    - **Nashorn JavaScript 引擎**:允许在 JVM 上运行 JavaScript 代码,使得 Java 应用程序能够直接与 JavaScript 交互。 ### 2. Oracle Oracle 数据库是一款关系型数据库管理系统,广泛应用于企业级应用。其主要...

    javaxiaocx.rar_javascript

    在Java世界中,Java小程序(Java Applet)是一种基于Java技术的小型应用程序,它可以在Web浏览器中运行。这个"javaxiaocx.rar_javascript"压缩包文件可能包含了一个关于Java小程序与JavaScript交互的示例或者教程。...

    applet图片展示,入门级

    在Java编程语言中,Applet是一种特殊的Java程序,它可以在Web浏览器中运行,为用户提供交互式的体验。Applets常用于创建动态网页,如动画、游戏或小型应用程序,其中包括图像展示功能。本文将深入探讨如何使用Java ...

    jfreehchar在LINUX下中文乱码的解决

    在启动Java应用程序时,可以通过设置JVM参数来指定默认的字符集。在命令行中启动应用时,添加以下参数: ``` java -Dfile.encoding=UTF-8 -jar your_application.jar ``` 这将确保Java虚拟机使用UTF-8编码处理...

    Apktool M v2.4.0-231005 完全免费的APK反编译工具,安卓反汇编神器

    Apktool M,俄罗斯编程爱好者开发的一款完全免费的APK反编译工具,用于逆向反编译和编译安卓应用和系统应用。支持对apk反编译、打包、拆分、合并、签名等;拥有语法高亮和强大的代码提示文件编辑器,能查看源java...

    Apktool M v2.4.0-230829 完全免费的APK反编译工具,安卓反汇编神器

    Apktool M,俄罗斯编程爱好者开发的一款完全免费的APK反编译工具,用于逆向反编译和编译安卓应用和系统应用。支持对apk反编译、打包、拆分、合并、签名等;拥有语法高亮和强大的代码提示文件编辑器,能查看源java...

    HTML5应用开发技术-移动互联中的Web应用.pptx

    例如,离线存储能力(Application Cache)允许应用程序在没有网络连接时也能正常工作;地理定位API使开发者能够轻松获取用户的地理位置信息;媒体元素(Audio和Video)支持直接在网页内播放多媒体内容,无需插件;...

    程序员Html5页面简历模板源码

    5. **Canvas和SVG**:这两个图形绘制技术使得程序员可以在简历中添加动态图表、自定义图标,展示编程技能的掌握程度。 6. **响应式设计**:HTML5与CSS3结合,可以实现响应式布局,确保简历在不同设备上都能良好显示...

    javaweb的文档,用于查询各种标签的功能以及使用,无需积分

    JavaWeb文档通常包含了大量的关于如何在Web开发中使用Java技术的信息。这个文档可能涉及了Servlet、JSP(JavaServer ...在实际工作中,开发者需要灵活运用这些工具和方法,以构建高效、稳定、用户友好的Web应用程序。

Global site tag (gtag.js) - Google Analytics