svgデスクトップアプリケーション(二)svgとjavaのインタラクション

8186 ワード

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は、alert('a')、func(',',')などのscript式です.
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();
	}
}

 
 
svg桌面应用程序(二)svg与java交互_第1张图片
 
図1JAva呼び出し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);
	}

}

 
 
svg桌面应用程序(二)svg与java交互_第2张图片
 
 
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を実行するのに1つのコアを占有する場合があり、単コア使用率100%、デュアルコア50%、4コア25%である.
 
svg cpuの使用を制限する必要があります:
canvas.setAnimationLimitingCPU(float);