现有的HTML元素在H:
下给出https://developer.mozilla.org/de/docs/Web/API
此处显示了可用的JAVA API类:
https://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/Element.html
不幸的是,org.w3c.dom软件包错过了一些更具体的元素,如 HTMLCanvasElement 。
我正在寻找一些至少支持HTMLCanvasElements的更高级的Java API (完整的WEP API支持会很棒)。
到目前为止我发现了:
一个。对于Project javafx-d3,我使用JavaFx WebView来控制Java中的一些JavaScript。 Java和JavaScript之间的通信基于 netscape.javascript.JSObject ,原则上工作正常:
我能够将我从JavaScript世界获得的JSObject转换为org.w3c.dom.Element ...并使用其Java方法来操作DOM。
如果我想“更深入”,例如控制HTMLCanvasElement,我必须编写基于JSObject的自己的包装器。这是可能的,但感觉就像重新发明轮子。
B中。 Google GWT 似乎提供了一些包装类,例如
com.google.gwt.dom.client.CanvasElement 的但是我没有设法将netscape.javascript.JSObject转换为GWT包装类(从 com.google.gwt.core.client.JavaScriptObject 开始)。
如果可以的话,有人可以提供一个例子吗?
有人知道如何在下面运行这个虚拟示例吗?
package main;
import elemental.client.Browser;
import elemental.html.AudioContext;
import elemental.html.AudioParam;
import elemental.html.Oscillator;
import elemental.html.Window;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class GwtElementDemo extends Application {
private Scene scene;
private Region browser;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
//set state title
stage.setTitle("JavaFx demo");
browser = new Region();
Window window = Browser.getWindow();
AudioContext audioContext = window.newAudioContext();
Oscillator osc = audioContext.createOscillator();
osc.setType(Oscillator.SQUARE);
osc.connect((AudioParam) audioContext.getDestination(), 0);
osc.getFrequency().setValue(440.0f);
osc.noteOn(0);
//create the scene
scene = new Scene(browser, 750, 500, Color.web("#666970"));
stage.setScene(scene);
stage.show();
}
}
GWT元素的maven依赖:
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-elemental</artifactId>
<version>2.8.0</version>
</dependency>
或者您是否知道用于DOM操作的替代/高级JAVA API(在JSObject层次结构上构建)?
答案 0 :(得分:2)
我是那个试图将Elemental移植到JavaFx的人,你在评论中提到过。我用它制作了一个名为Animation Companion的小应用程序,它并不是那么好。随JavaFx提供的WebKit引擎缺少许多功能,将大量数据从Java迁移到JavaScript并返回它的速度非常慢。 JavaFx人员重写了WebKit以依赖JavaFx进行渲染,有时会出现一些不匹配的情况,如果你过于用力推动UI,会导致事情崩溃或耗尽资源。此外,Elemental本身有点过时,有很多特定于WebKit的功能,缺少功能和其他错误。
来自我的github的测试JavaFx代码要求您首先构建元素。我不完全记得怎么做。我想你只是进入元素目录并在那里运行ant
,然后你可以在某处链接测试的gwt-elemental.jar
文件输出。我暂时在http://www.user00.com/gwt-elemental.jar放置了预建版本。您还需要来自GWT 2.7的gwt-user.jar
的一些文件。我暂时在http://www.user00.com/gwt-user-pruned.jar处提供了这些文件。从那里,您可以使用以下内容开始一个网页:
Stage stage = ...
// Create the WebView
BorderPane border = new BorderPane();
WebView webView = new WebView();
final WebEngine engine = webView.getEngine();
border.setCenter(webView);
Scene scene = new Scene(border);
stage.setScene(scene);
stage.show();
// Redirect the alert handler to send output to stderr
engine.setOnAlert(new EventHandler<WebEvent<String>>() {
@Override
public void handle(WebEvent<String> msg) {
System.err.println(msg.getData());
}});
// Start up the Gwt module when the page has finished loading. Grab the window
// and document objects and stash them somewhere for use later.
engine.getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == Worker.State.SUCCEEDED) {
Window win = (Window)GwtFxBridge.wrapJs(engine.executeScript("window"));
// The web page is loaded, and you have the global window
// JS object, so you can start your UI now
}
}
});
// Load the main Gwt application web page
try {
engine.load(new File("ui/index.html").toURI().toURL().toExternalForm());
}
catch(MalformedURLException e)
{
throw new IllegalArgumentException("Misconfiguration error. Cannot find empty web page", e);
}
我真的不建议沿着这条路走下去。它没有足够的支持,你必须知道你的JavaScript和你的Java,以便调试你将面临的问题。我认为颠倒事物更有意义。运行nw.js以运行JavaScript作为驱动应用程序的主VM,然后在需要执行Java操作时根据需要调用Java。您甚至可以使用GWT从Java代码生成JavaScript。
答案 1 :(得分:0)
是的,有一个,非常接近你已经找到的。它被称为GWT元素。虽然它是GWT,它实际上直接在DOM上,非常完整,真的非常喜欢直接在DOM上的薄冰。我正在使用它在https://github.com/nielsbaloe/vertxui编写100%java 100%异步框架VertxUI。