`

svg桌面应用程序(二)svg与java交互

    博客分类:
  • svg
 
阅读更多

svg桌面应用程序需要界面与后台的交互,当点击界面中一按钮时,需要后台java中处理事务,然后传回到界面中显示。

 

1.svg中js代码中运行java代码:

 

参考http://xmlgraphics.apache.org/batik/using/scripting/ecmascript.html

 

<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
  <circle cx="50" cy="50" r="50" fill="green" onclick="showFrame()"/>
  <script type="text/ecmascript">
    importPackage(Packages.javax.swing);

    function showFrame() {
      var frame = new JFrame("My test frame");
      var label = new JLabel("Hello from Java objects created in ECMAScript!");
      label.setHorizontalAlignment(SwingConstants.CENTER);
      frame.getContentPane().add(label);
      frame.setSize(400, 100);
      frame.setVisible(true);
      frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
  </script>
</svg>

 

 

   importPackage(Packages.javax.swing);   引入java.swing包

 

  JFrame是一个java类,以上是script代码中用JFrame弹出一个窗体。

2. java控制svg-script

 

canvas.getUpdateManager().getScriptingEnvironment().getInterpreter().evaluate(String param);

 

canvas为JSVGCanvas实例

param为script表达式,如alert('a'), func('','','')

evaluate相于中js 中eval方法。

 

个人认为以上方法的控制效果并不理想,如当要定时去改变svg的某元素状态时,经常出现黑区域和闪烁现象,而且界面也常弹出错误框,而在script代码中定时改变状态时,则不会出现此种情况。 由于script中可以访问java空间,所以我们可以在java空间加入一系列的任务,而script则定时去访问这个任务列表,取出这些任务,然后执行,删除任务。

 

任务列表SVGJs.java

public static Queue<String> tasks = new ConcurrentLinkedQueue<String>();

 

java中pushTask,将script要调用的方法,参数存储起来。

	public static String popTask(){
		synchronized(tasks){
			return tasks.poll();
		}
	}
	public static void pushTask(String t){
		synchronized(tasks){
			tasks.add(t);
		}
	}

 

svg-script中取出任务,然后执行

function callFunc(){
	var task = SVGJs.popTask();
	while(task!=null)
	{
		eval(task);
		task = SVGJs.popTask();
		
	}

}

 

可用setTimeout设置callFunc定时运行。

 

eg1.使用第一种方法java直接调用script

 

package com.longshine.svg.ui;

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.swing.JFrame;

import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;

public class SVGUIApp extends JFrame{

	public void init(){
		this.setBounds(0, 0, 800, 600);
		this.setDefaultCloseOperation(3);
		this.setVisible(true);
		String parser = XMLResourceDescriptor.getXMLParserClassName();
		SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
		File file = new File("bin/com/longshine/svg/ui/3D.svg");
		try {
			Document indexDoc = f.createDocument(file.toURL().toString());
			JSVGCanvas canvas = new JSVGCanvas();
			canvas.setBackground(Color.BLACK);
			canvas.setVisible(true);
			canvas.setBounds(0, 0, 800, 600);

		canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
		canvas.setDocument(indexDoc);
		this.add(canvas);
		Thread.sleep(5000);
		canvas.getUpdateManager().getScriptingEnvironment().getInterpreter().evaluate("test()");//*************调用script中test********************
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	public static void main(String[] args){
		new SVGUIApp().init();
	}
}

 

 

 

图一.java调用script test()方法

script中调用java 中println方法

 

importPackage(Packages.com.longshine.svg.ui);

 SVGJs.println("call java function");

 

 

package com.longshine.svg.ui;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class SVGJs {
	public static void println(Object o){
		System.out.println(o);
	}

}

 

 

 

 

eg2.java间接调用,实现 图一效果

 

 

package com.longshine.svg.ui;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class SVGJs {
	public static Queue<String> tasks = new ConcurrentLinkedQueue<String>();//任务列表

	public static String popTask(){//取出任务
		synchronized(tasks){
			return tasks.poll();
		}
	}
	public static void pushTask(String t){//加入任务
		synchronized(tasks){
			tasks.add(t);
		}
	}
	public static void println(Object o){
		System.out.println(o);
	}

}

 

 

package com.longshine.svg.ui;

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.swing.JFrame;

import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;

public class SVGUIApp extends JFrame{

	public void init(){
		this.setBounds(0, 0, 800, 600);
		this.setDefaultCloseOperation(3);
		this.setVisible(true);
		String parser = XMLResourceDescriptor.getXMLParserClassName();
		SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
		File file = new File("bin/com/longshine/svg/ui/3D.svg");
		try {
			Document indexDoc = f.createDocument(file.toURL().toString());
			JSVGCanvas canvas = new JSVGCanvas();
			canvas.setBackground(Color.BLACK);
			canvas.setVisible(true);
			canvas.setBounds(0, 0, 800, 600);

		canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
		canvas.setDocument(indexDoc);
		this.add(canvas);
		Thread.sleep(5000);
//		canvas.getUpdateManager().getScriptingEnvironment().getInterpreter().evaluate("test()");
		SVGJs.pushTask("test()");//间接调用
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	public static void main(String[] args){
		new SVGUIApp().init();
	}
}

 

 

 

function callFunc(){
	var task = SVGJs.popTask();
	while(task!=null)
	{
		eval(task);
		task = SVGJs.popTask();
		
	}
	setTimeout('callFunc()',500);
}
callFunc();//定时从java SVGJs类中取出任务执行

 

question:  有时svg 程序运行cpu占用一个核,单核使用率100%,双核50%,4核25%.

 

需限制svg cpu使用:

canvas.setAnimationLimitingCPU(float);

 

  • 大小: 22.2 KB
  • 大小: 6 KB
分享到:
评论

相关推荐

    桌面应用程序.rar

    "桌面应用程序.rar"这个压缩包文件的标题暗示了它包含的内容可能与开发或部署桌面应用程序有关。虽然没有明确的描述,但我们可以根据标签和子文件夹名称来推测其中的知识点。 1. **WEB-INF**: 这是Java Web应用中一...

    CAD(dwg)转SVG.rar

    C#是一种常用的.NET Framework开发语言,适合创建桌面应用程序,如这种文件转换工具。 在转换过程中,首先需要打开DWG文件,然后通过CAD软件提供的API(应用程序接口)来读取和解析DWG文件的内容。这些API允许...

    基于SpringBoot、Swing、H2和JPA的桌面应用程序设计源码

    该项目是一款采用SpringBoot、Swing、H2数据库和JPA构建的桌面应用程序设计源码,包含43个文件,涵盖17个Java源文件、13个PNG图像文件、3个表单文件、2个SQL和SVG文件,以及其他相关配置和文档。该应用程序适用于...

    JAVA课件-小应用程序

    【JAVA课件-小应用程序】 Java小应用程序,通常被称为Applet,是Java编程语言中的一种特殊类型的应用程序,设计用于在网络浏览器中运行。这个课件的主题聚焦于如何开发和使用这些小巧而强大的交互式组件。Java ...

    使用Java创建图形绘制应用程序 - 一个实战教程

    1. **Java Swing库**:Java Swing是Java GUI(图形用户界面)的一部分,用于创建桌面应用程序。它包含一组组件,如JFrame、JPanel、JButton等,用于构建用户界面。在这个项目中,我们将使用JPanel作为绘图区域,并...

    FlexUI:FlexUI或(灵活用户界面)是一个旨在将HTML5和CSS图形设计的功能嵌入Java桌面应用程序的项目

    FlexUI,全称为“柔性用户界面”,是一款专为Java桌面应用程序设计的开源框架,它将HTML5和CSS3的强大功能引入到传统的Java开发环境中。这个项目的目标是打破Java桌面应用在用户界面设计上的局限性,使得开发者能够...

    基于BlazeDS实现股票系统中Flex与Java的通信.pdf

    它可以用于构建具有极强表现力的Web或桌面应用程序。这些应用程序利用Adobe Flash Player和Adobe AIR,运行时可以跨浏览器、桌面和操作系统来实现一致的部署。 Flex的优点在于它支持基于矢量的绘制,并且直接嵌入...

    batik框架 jar包

    这使得开发者可以在Java应用程序中嵌入SVG图像,或者通过Web服务动态生成SVG图像。 3. **SVG到其他格式转换**: Batik框架提供了一种将SVG图像转换为其他格式的能力,如将SVG转换为常见的位图格式(如PNG、JPEG),...

    java开发前端和后端api汇总

    Java开发涵盖了前端和后端的多个重要组成部分,API(应用程序编程接口)是这些组件的核心,提供了丰富的功能和交互方式。以下是对标题和描述中涉及的知识点的详细解释: 1. **CSS**: Cascading Style Sheets(层叠...

    java画图板程序

    这个程序通常基于Java的AWT(Abstract Window Toolkit)或者Swing库来构建,这两个库为开发者提供了丰富的组件和功能,用于创建桌面应用程序。 首先,让我们深入了解Java的AWT和Swing库。AWT是Java的早期GUI(图形...

    Java-API文档(学Java必备API)

    8. **AJAX (Asynchronous JavaScript and XML)**:是一种创建交互式Web应用程序的技术,通过在后台与服务器交换数据并局部更新页面,实现了页面的无刷新更新。 9. **EasyUI**:是一个基于jQuery的前端框架,用于...

    java开源包6

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包9

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包4

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java 常用代码

    8. **WinForm**:虽然WinForm主要与.NET Framework相关,但它代表了Windows桌面应用程序的开发。在Java领域,Swing或JavaFX是类似的概念,用于构建桌面应用程序。 9. **XML**(eXtensible Markup Language):XML是...

    java开源包101

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    OkapiBarcode,用Java编写的开源条码编码程序.zip

    OkapiBarcode可以轻松集成到Java应用程序中,无论是在桌面应用、Web应用还是移动应用。例如,它可以嵌入到网页中,通过JavaScript与Java Applet交互,或者在Android应用中生成条码图片。这大大提高了应用的功能性和...

    java开源包5

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包8

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

Global site tag (gtag.js) - Google Analytics