svgデスクトップアプリケーション(二)svgとjavaのインタラクション
8186 ワード
svgデスクトップアプリケーションでは、インタフェースとバックグラウンドのインタラクションが必要です.インタフェースのボタンをクリックすると、バックグラウンドjavaでトランザクションを処理し、インタフェースに戻って表示する必要があります.
1.svgのjsコードでjavaコードを実行する:
参照http://xmlgraphics.apache.org/batik/using/scripting/ecmascript.html
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
JAvaではpushTask,scriptを呼び出すメソッド,パラメータを格納する.
svg-scriptでタスクを取り出し、実行
settimeoutでcallFuncタイミング運転を設定できます.
eg1.最初のメソッドjavaを使用してscriptを直接呼び出す
図1JAva呼び出しscript test()メソッド
scriptでjavaでprintlnメソッドを呼び出す
eg2.JAva間接呼び出し、図一効果を実現
question:svgプログラムがcpuを実行するのに1つのコアを占有する場合があり、単コア使用率100%、デュアルコア50%、4コア25%である.
svg cpuの使用を制限する必要があります:
canvas.setAnimationLimitingCPU(float);
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();
}
}
図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);
}
}
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);