Written by (待查证)
2006-Oct-10
关键字 svg、Java application、JavaScript、batik、swing
概要:
SVG 作为一种开源的矢量绘图标准,应用越来越广泛。SVG与WEB应用程序的结合较为常见,开发也相当方便(IE + SVGView + Script)。那么SVG是否可以与Java Application程序结合呢?答案当然是肯定的。本文就是简要介绍SVG在Java Application上的应用方法。
应用技术SVG、JavaScript、swing
SVG的插件包(batik)
在浏览器上浏览SVG文件,需要安装SVG的插件,例如SVGView。在Java Application程序上也需要有SVG的插件包,如batik(http://xmlgraphics.apache.org/batik/)。该包是apache项目组的一个开源项目,该包解析了SVG中的大部分标签,可以为开发人员提供相当的空间,用来实现用户和SVG文件的交互。
Java Application画面技术的选择(SWING)
用Java来做Application大致可用的技术有AWT、SWING、SWT等。这些技术
如何选择可以参考其他更权威的材料,我的开发经验也不多,无权发表意见。但就本文来讲,采用的技术是SWING。原因有以下方面:1、batik包本身使用 SWING技术实现的。2、据说SWING可以相对方便的移植到UNIX上(因为我们的项目需要在windows和UNIX上运行)。
用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文件。
获得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;
改变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);
监听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)。
在JavaScript中调用Application的方法
SVG和JavaApplication的交互方式除了上述的以外,还可在SVG的脚本中调用JavaApplication的方法。
例如在SVG的JavaScript脚本中添加如下代码:
importPackage(Packages.包名);
function fortest(){
SVGApplication.svggeIcName.setAttribute("display","inline");
SVGApplication.svggeAll.setAttribute("transform","translate(0,0)");
}
(全文结束)
分享到:
相关推荐
1. **离线存储**:通过`Application Cache`,允许网页在离线状态下也能访问部分数据。 2. **语义化标签**:如`<article>`、`<section>`等,使文档结构更清晰,利于SEO和无障碍访问。 3. **媒体元素**:内建的`...
在本文中,我们将深入探讨如何使用WPF(Windows Presentation Foundation)将SVG(Scalable Vector Graphics)图形转换为XAML(Extensible Application Markup Language),这是一个在.NET Framework中用于构建用户...
"ApplicationList.zip" 是一个包含源代码文件的压缩包,主要针对Android应用开发。这个压缩包中的文件提供了关于Android应用程序的构建和配置信息。以下是这些文件的详细解释和相关知识点: 1. `.classpath` 和 `(2...
Java API(Application Programming Interface)是Java开发的核心组成部分,它提供了大量的类库和接口,使得开发者能够快速构建应用程序。JDK_API6.0.CHM文件是Java Development Kit(JDK)6.0的API文档,包含了所有...
JavaServer Pages(JSP)技术是Java平台上的一个重要组成部分,它被设计用来简化Web应用开发,特别是对于创建动态网页。JSP允许开发者将静态HTML或者其他基于文本的格式(如SVG、WML、XML)与Java代码结合起来,从而...
在Java中,图形图像处理主要依赖于Java 2D API(Application Programming Interface)和Java Advanced Imaging (JAI)库。这些工具集提供了一系列的类和方法,使得开发者能够实现复杂的图像操作,如绘制图形、渲染...
它简化了Java应用的构建过程,使得开发者可以更专注于业务逻辑而不是基础设施的配置。通过SpringBoot,我们可以轻松集成如数据库连接、模板引擎、安全控制等多个组件,极大地提高了开发效率。 项目中使用了MySQL...
- **Nashorn JavaScript 引擎**:允许在 JVM 上运行 JavaScript 代码,使得 Java 应用程序能够直接与 JavaScript 交互。 ### 2. Oracle Oracle 数据库是一款关系型数据库管理系统,广泛应用于企业级应用。其主要...
在本章节中,我们将深入探讨Java编程语言在处理文件压缩,特别是上传shape压缩包方面的应用。Java作为一种广泛使用的编程语言,提供了丰富的API和工具来处理各种文件操作,包括压缩和解压缩。在这个主题中,我们将...
在Java ADF(Application Development Framework)环境中,MapTips是一种重要的用户交互功能,主要用于地图应用中为用户提供特定位置的详细信息。通过悬停或点击地图上的某个地理要素,MapTips能够即时显示该要素的...
在Java世界中,Java小程序(Java Applet)是一种基于Java技术的小型应用程序,它可以在Web浏览器中运行。这个"javaxiaocx.rar_javascript"压缩包文件可能包含了一个关于Java小程序与JavaScript交互的示例或者教程。...
在Java编程语言中,Applet是一种特殊的Java程序,它可以在Web浏览器中运行,为用户提供交互式的体验。Applets常用于创建动态网页,如动画、游戏或小型应用程序,其中包括图像展示功能。本文将深入探讨如何使用Java ...
JAR是Java平台上的一个归档格式,它用于收集多个Java类文件和相关的元数据,以便在一个单一的可分发单元中运行。永中转换jar包集合中的每个JAR文件代表了一个特定的功能模块或库,可以被Java程序通过添加到类路径来...
综上所述,这个“程序员Html5页面简历模板源码”不仅提供了创建专业简历的工具,还展示了HTML5的最新特性以及Java在Web开发中的应用,对提升程序员的求职竞争力大有裨益。开发者可以根据自己的实际经验和技能进行...
Native App使用特定平台的原生编程语言,如Android的Java或iOS的Swift,提供最佳的性能和用户体验,但开发成本较高,且需在各个平台上单独维护。移动Web则直接在浏览器中运行,开发成本低、更新维护便捷,但性能和...
- 支持多种输出格式:SVG、EPS、位图和Java2D。 - 支持多种条形码类型:DataMatrix、PDF417等。 - **示例代码**: ```java import org.krysalis.barcode4j.impl.datamatrix.DataMatrixCode; import org....
- `jar`:`application/java-archive`,JAR(Java Archive)文件用于打包Java应用程序或库。 5. 其他格式: - `html`或`htm`:`text/html`,HTML是超文本标记语言,用于创建网页。 - `css`:`text/css`,CSS...