Hi Michael,

Yes, WebEngine can be used separately from WebView.

(See inline, please)

On 05/02/15 02:53, Michael Pozhidaev wrote:
Hello everybody,

I am working on the technology representing the information in form
which adjusted to the perception of blind people. It is just as
an addition to usual screen readers.

For a long time there was a rather big problem, it is a web browsing. My
environment is implemented in Java but I was unable to get any web
browser features.Any web surfing activity was possible only if you are
using a fully functional browser, like Firefox, Chrome, etc.

 From time to time I looked for any browser implementations in Java but
everything what I got  never looked interesting. The picture totally
changed when I found javafx.scene.web. At a glance it looks like exactly
what I need!

The key feature which looks nice to me is a splitting a visualization and
a background engine. I need exactly the engine which manages DOM, can
execute JavaScript, sends all notifications and events, but don't take
care about graphical representation. The description for WebEngine class
says that it suits completely.

OK, but I would like to ensure that JavaFX itself suits as well. Meaning, may I
use WebEngine class without creating _*graphical*_ application? In other
words, what should the execution environment for WebEngine be?

There are two questions I would like to understand:

1. Should I create a full graphical application in JavaFX traditions to
be able to use WebEngine? My application uses a speech feedback as a
main way to bring information to users. If it is required that I should
have a complete graphical scene for using WebEngine it would be bad news
for me.

Well, you need to create a JavaFX application in order to start using WebEngine,
but you don't need to display any GUI (Stage, Scene etc.) on the screen.

If that works for you, then basicly it may look as follows:

import javafx.application.Application;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;

public class MyWebApp extends Application {
    static WebEngine web;

    public MyWebApp() {}

    public void start(Stage s) {
        web = new WebEngine();
        web.getLoadWorker().stateProperty().addListener(
            new ChangeListener<State>() {
public void changed(ObservableValue ov, State oldState, State newState) {
                    if (newState == State.SUCCEEDED) {
                        System.out.println(web.getTitle());
                    }
                }
            });
        web.load("http://javafx.com";);
    }
}

The "start" method is your entry point into the JavaFX App thread.
That's where WebEngine must be created and managed, and you can't do it anywhere else (that's why you need a JavaFX app even if you don't plan to use any GUI stuff).

You may also launch a JavaFX app tradittionally, via the "main" method:

import javafx.application.Application;

public class Main {
    public static void main(String[] args) {
        Application.launch(MyWebApp.class, args);
    }
}

The "launch" method won't return untill JavaFX has exited, so you need to start your base logic (start your worker threads) before this call.

The way you access your WebEngine instance is either via its associated listeners or via Platform.runLater():

Platform.runLater(new Runnable() {
public void run() {
         System.out.println(MyWebApp.web.getLocation());
     }
});

Both ways you do it on the JavaFX App thread.

One more thing is that you should prevent JavaFX from auto-exit. This happens after the last Stage is closed. As you don't have any Stage open, you should tell JavaFX that you want it to continue until you explicitly request it to exit.

This is what you need to call first from the "start" method:

Platform.setImplicitExit(false);

(Actually, WebEngine itself should prevent JavaFX from auto-exit, but you're better to do that explicitly.)

2. Do I understand correctly that JavaFX applications are able to be
launched just in Java Virtual Machine? Meaning, they do not need a
complete web browser, right? I found that javafx.scene.web using
webkit and it is OK. I am asking that the user shouldn't need opening a web
browser window and run JavaFX application in it, yes?

What you're telling about is the "applet mode". You're not limited to it. You can launch your JavaFX app as a standlone application.
So, you don't need to open a browser.


Help me please! If these questions would be OK I would be able to
significantly improve my environment!

Thank you in advance! :))

You're welcome!

Regards,
Anton.

Reply via email to