2017-01-05 1 views
1

Les éléments HTML existants sont donnés ici sous H:API Java pour la manipulation d'éléments DOM html/Javascript dans une application de bureau?

https://developer.mozilla.org/de/docs/Web/API

Les classes disponibles API JAVA sont présentés ici:

https://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/Element.html

Malheureusement, le paquet org.w3c.dom manque un peu éléments plus spécifiques comme HTMLCanvasElement.

Je suis Je suis à la recherche d'une API Java plus avancée qui supporte au moins les HTMLCanvasElements (la prise en charge complète de l'API WEP serait excellente).


Ce que je trouve à ce jour:

A. Pour le projet javafx-d3-je utiliser la WebView JavaFX pour contrôler un peu de JavaScript en Java. La communication entre Java et JavaScript est basé sur netscape.javascript.JSObject et fonctionne très bien en principe:

Je suis en mesure de jeter un JSObject que je suis arrivé du monde JavaScript à un org.w3c.dom.Element ... et de l'utilisation ses méthodes Java pour manipuler le DOM.

Si je veux "aller plus loin", par ex. contrôle un HTMLCanvasElement, je dois écrire mes propres wrappers basés sur JSObject. C'est possible mais c'est comme réinventer la roue.


B. Google GWT semble fournir des classes wrapper, par exemple

com.google.gwt.dom.client.CanvasElement pour HTMLCanvasElement

Cependant, je n'a pas réussi à convertir netscape.javascript.JSObject aux classes d'emballage GWT (à partir de com.google.gwt.core.client.JavaScriptObject).

Si cela est possible, quelqu'un pourrait-il donner un exemple?

Quelqu'un sait comment faire fonctionner cet exemple factice?

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(); 

    } 

} 

dépendance Maven pour élémentaire GWT:

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

Ou connaissez-vous une alternative/avancée API JAVA pour la manipulation DOM (qui est construit sur la hiérarchie JSObject)?

Répondre

1

Je suis le gars qui a essayé de porter Elemental à JavaFx que vous avez mentionné dans les commentaires. J'ai fait une petite application appelée Animation Companion avec elle, et ce n'est pas génial. Le moteur WebKit fourni avec JavaFx manque de nombreuses fonctionnalités, et il est très lent de déplacer beaucoup de données de Java vers JavaScript et inversement. Les gens de JavaFx ont réécrit WebKit pour dépendre de JavaFx pour son rendu, et parfois il y a un peu de discordance, ce qui va provoquer des plantages ou des pertes de ressources si vous appuyez trop fort sur l'interface utilisateur. En outre, Elemental lui-même est un peu démodé avec beaucoup de fonctionnalités spécifiques à WebKit, des fonctionnalités manquantes et d'autres bogues.

Le code JavaFx de test de mon github vous oblige à construire d'abord élémentaire. Je ne me souviens pas entièrement comment faire cela. Je pense que vous allez juste dans le répertoire élémentaire et exécutez ant là, et puis vous obtenez une sortie de fichier gwt-elemental.jar quelque part que vous pouvez lier les tests contre. J'ai temporairement mis une version pré-construite au http://www.user00.com/gwt-elemental.jar. Vous avez également besoin de quelques fichiers de gwt-user.jar de GWT 2.7. J'ai temporairement rendu ces fichiers disponibles au http://www.user00.com/gwt-user-pruned.jar. De là, vous pouvez commencer une page Web avec quelque chose comme ceci:

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); 
} 

Je ne conseillerais vraiment pas de descendre cette route. Il n'y a tout simplement pas assez de support pour cela, et vous devez vraiment connaître votre JavaScript et votre Java pour déboguer les problèmes auxquels vous serez confronté. Je pense qu'il est plus logique d'inverser les choses. Exécutez nw.js pour exécuter JavaScript en tant que machine virtuelle principale pilotant votre application, puis appelez Java si nécessaire si vous devez effectuer des opérations Java. Vous pouvez même utiliser GWT pour générer votre JavaScript à partir du code Java.

+0

Merci pour la réponse détaillée. En utilisant vos jarres j'ai une application JavaFx en cours d'exécution qui est capable de contrôler le DOM avec l'API élémentaire gwt. win.alert ("Bonjour tout le monde"); travaille et je suis capable de récupérer la hauteur du document. window.newAudioContext() ne fonctionne pas ... ce qui peut être dû aux restrictions que vous avez mentionnées. – Stefan

+0

J'ai également trouvé quelques problèmes de performances de WebView pour mon projet java-fx et d'autres informations sur ce sujet peuvent être trouvées ici: http: // stackoverflow.com/questions/10762979/performance-of-webview-in-javafx – Stefan

+0

L'utilisation de JxBrowser commercial au lieu de WebView peut être une option. Il y a peut-être aussi d'autres alternatives. – Stefan

0

Oui il y en a un, très proche de ce que vous avez déjà trouvé. Il est appelé élémentaire GWT. Bien que ce soit GWT, c'est vraiment directement sur le DOM, incroyablement complet et vraiment comme de la glace fine directement sur le DOM. Je l'utilise pour écrire un cadre 100% Java 100% asynchrone VertxUI à https://github.com/nielsbaloe/vertxui.

+0

Vous semblez avoir beaucoup d'expérience avec l'élémentaire GWT. Voyez-vous un moyen de compléter l'exemple d'application JavaFx que j'ai ajouté ci-dessus pour montrer du contenu élémentaire GWT sur la scène JavaFx? Y a-t-il un constructeur de navigateur que je pourrais utiliser? – Stefan

+0

Je viens de trouver un projet qui a porté l'élémentaire GWT sur JavaFx. Je ne l'ai pas encore essayé: https://github.com/my2iu/gwt – Stefan

+0

Je ne suis pas vraiment expérimenté dans l'élémentaire GWT, ça marche vraiment très bien dès la sortie de la boîte. Je n'utilise que document, console et fenêtre, en d'autres termes: les primitives qui sont disponibles sur javascript dans le navigateur. Je ne sais pas pour le reste. Je n'ai aucune expérience dans JavaFX (qui me semble un peu mort). Bonne chance en regardant le lien ci-dessus! – Niels