2017-01-05 6 views
1

Существующие HTML элементы приведены здесь под H:API-интерфейс Java для управления элементами DOM html/Javascript в настольном приложении?

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.

Я ищет более продвинутый Java API, который по крайней мере поддерживает HTMLCanvasElements (полная поддержка WEP API будет отличной).


То, что я нашел до сих пор:

A. Для проекта javafx-d3 я использую WebView JavaFX для управления некоторыми JavaScript в Java. Связь между Java и JavaScript основана на netscape.javascript.JSObject и отлично работает в принципе:

Я могу бросить JSObject, что я получил от мира JavaScript к org.w3c.dom.Element ... и использование его методы Java для управления DOM.

Если я хочу «пойти глубже», например. управляйте HTMLCanvasElement, я должен написать свои собственные обертки на основе JSObject. Это возможно, но кажется, что изобретать колесо.


B. Google GWT кажется, обеспечивают некоторые оболочки классов, например,

com.google.gwt.dom.client.CanvasElement для HTMLCanvasElement

Однако мне не удалось преобразовать 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(); 

    } 

} 

Maven зависимостей для GWT элементного:

<dependency> 
     <groupId>com.google.gwt</groupId> 
     <artifactId>gwt-elemental</artifactId> 
      <version>2.8.0</version> 
</dependency> 

Или вы знаете, альтернативный/расширенный JAVA API для манипулирования DOM (то есть построить на иерархии JSObject)?

ответ

1

Я тот парень, который попытался передать Elemental в JavaFx, о котором вы упомянули в комментариях. Я сделал небольшое приложение под названием Animation Companion с ним, и это просто не так уж здорово. Механизм WebKit, снабженный JavaFx, не имеет большого количества функций, и очень медленно перемещать много данных с Java на JavaScript и обратно. Люди JavaFx переписали WebKit, чтобы зависеть от JavaFx для его рендеринга, а иногда есть немного несоответствия, которые могут привести к сбоям или исчерпанию ресурсов, если вы слишком сильно нажимаете на интерфейс. Кроме того, сам Elemental немного устарел от множества специфических функций WebKit, отсутствующих функций и других ошибок.

Тест-код JavaFx от моего github требует, чтобы вы сначала создали элемент. Я не совсем помню, как это сделать. Я думаю, что вы просто заходите в элементную директорию и запустите там ant, а затем вы получите файл с файлом gwt-elemental.jar, где вы можете связать тесты. Я временно поставил предварительно построенную версию на http://www.user00.com/gwt-elemental.jar. Вам также нужно несколько файлов от gwt-user.jar от GWT 2.7. Я временно сделал эти файлы доступными по адресу 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 в качестве главной виртуальной машины, управляющей вашим приложением, а затем при необходимости вызовите на Java, если вам нужно делать Java-вещи. Вы даже можете использовать GWT для генерации JavaScript с Java-кода.

+0

Спасибо за подробный ответ. Используя ваши банки, я получил приложение JavaFx, которое может управлять DOM с помощью gwt elemental api. win.alert («Hello World»); работает, и я могу получить высоту документа. window.newAudioContext() не работает ... что может быть связано с ограничениями, которые вы упомянули. – Stefan

+0

Я также нашел некоторые проблемы с производительностью WebView для моего проекта java-fx, и дополнительную информацию по этой теме можно найти здесь: http: // stackoverflow.com/questions/10762979/performance-of-webview-in-javafx – Stefan

+0

Использование коммерческого JxBrowser вместо WebView может быть вариантом. Возможно, есть и другие альтернативы. – Stefan

0

Да, есть один, очень близкий к тому, что вы уже нашли. Он называется элементным элементом GWT. Хотя это GWT, это действительно прямо на DOM, невероятно полный и действительно очень тонкий лед прямо на DOM. Я использую его для написания 100% -ной асинхронной структуры Java VertxUI на уровне https://github.com/nielsbaloe/vertxui.

+0

У вас, похоже, много опыта с элементом GWT. Вы видите способ, как заполнить пример приложения JavaFx, который я добавил выше, чтобы показать некоторый элемент элемента GWT на сцене JavaFx? Есть ли какой-нибудь конструктор браузера, который я мог бы использовать? – Stefan

+0

Я только что нашел проект, который портировал GWT elemental на JavaFx. Еще не пробовал: https://github.com/my2iu/gwt – Stefan

+0

Я не очень разбираюсь в элементах GWT, он просто отлично работает прямо из коробки. Я использую только документ, консоль и окно, другими словами: примитивы, доступные на javascript в браузере. Я не знаю обо всем остальном. У меня нет никакого опыта в JavaFX (который выглядит мне как-то мертвым). Удачи вам, посмотрев ссылку выше! – Niels

 Смежные вопросы

  • Нет связанных вопросов^_^