JavaFX: встраивание браузера, отличного от доступного веб-просмотра, с помощью JavaFX.

Я работаю над приложением JavaFX, которое содержит несколько файлов html, css, JS, которые отображаются внутренним браузером webkit. Теперь проблема заключается в том, что анимация CSS, которая у нас есть, не отображается плавно в браузере webkit, предоставляемом JavaFX, но тот же код в Firefox или Chrome работает более плавно.

Кроме того, постоянство недоступно (в настоящее время используются переменные в Java и связь через JS для сохранения).

То, что я ищу, есть ли способ интегрировать какой-нибудь безголовый браузер или некоторые настройки, чтобы сделать анимацию CSS более плавной. Единственное, с чем я столкнулся, был JxBrowser, но он слишком дорог для личного использования.

Код :

public class Main extends Application {

    private Scene scene;
    MyBrowser myBrowser;

    String completeText = "";

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Frontend");
        java.net.CookieManager manager = new java.net.CookieManager();
        java.net.CookieHandler.setDefault(manager);

        myBrowser = new MyBrowser();
        scene = new Scene(myBrowser, 1080, 1920);

        primaryStage.setScene(scene);
        primaryStage.setFullScreen(true);
        primaryStage.show();

        // @ being the escape character
        scene.setOnKeyTyped(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                String text = event.getCharacter();
                if (text.equals("0")) {
                    String tempText = completeText;
                    completeText = "";
                    processText(tempText);
                }else {
                    completeText = completeText+text;
                }
            }
        });
    }
}

Мой браузер:

public class MyBrowser extends Region {

public MyBrowser() {
        webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue == Worker.State.SUCCEEDED) {
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("app", this);
            }
        });




        URL urlHello = getClass().getResource(hellohtml);

        webEngine.load(urlHello.toExternalForm());
        webView.setPrefSize(1080, 1920);
        webView.setContextMenuEnabled(false);
        getChildren().add(webView);
    }

Код CSS, который содержит анимацию:

#ball-container.go #ball{
-webkit-animation: rotating-inverse 2s ease-out 0s 1 normal;
animation: rotating-inverse 2s ease-out 0s 1 normal;
}


#ball-container {
height: 102px;
width: 102px;
position: absolute;
top: -95px;
left: 480px;
-webkit-transition: all 0.9s ease-in-out 0s;
transition: all 0.9s ease-in-out 0s;
}



#ball-container.shake .ball-wrapper{
-webkit-animation: yAxis 0.9s ease-in-out;
animation: yAxis 0.9s ease-in-out;
}

Спасибо.


person We are Borg    schedule 20.05.2016    source источник
comment
Предоставленный вами код не компилируется. Также отсутствует HTML.   -  person Oliver Jan Krylow    schedule 27.06.2016
comment
@OJKrylow: этот код предназначен только для справки, это одна из имеющихся у нас анимаций. Вы можете попробовать любую анимацию CSS из сети (мы уже сделали это), и производительность будет низкой.   -  person We are Borg    schedule 27.06.2016
comment
Я протестировал WebView с помощью daneden.github.io/animate.css в 64-битном и 32-битном режимах. . С анимацией заметных рывков нет. За исключением того, что некоторые элементы отображаются неправильно, анимация выглядит нормально.   -  person Oliver Jan Krylow    schedule 28.06.2016
comment
@OJKrylow: К сожалению, у нас не было такого опыта, как у вас. Поскольку у нас есть движущийся футбольный мяч, неправильная визуализация элементов может вызвать проблему. В любом случае, мы ищем лучшее решение. Благодарю вас.   -  person We are Borg    schedule 29.06.2016
comment
Я вижу, вы упомянули jxbrowser, это обертка фреймворка хрома, простой фреймворк которого здесь bitbucket .org/chromiumembedded/java-cef — там нет невероятного количества документации/примеров кода, так что это не будет простой работой по удалению и замене, но он должен иметь ту же функциональность, что и веб-просмотр.   -  person chris.fy    schedule 23.07.2016


Ответы (2)


Попробуйте использовать Java 8u112 на основе вашего код, который я создал рабочий образец (протестировано с использованием Java JDK 8u112 64bit):

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class Example extends Application
{
    public static void main(String[] args)
    {
        launch(args);
    }

    class MyBrowser extends Parent
    {
        private WebEngine   webEngine;
        private WebView webView;

        public MyBrowser()
        {
            webView = new WebView();
            webEngine = webView.getEngine();

            // Ugly (but easy to share) HTML content 
            String pageContents = 
                    "<html>"
                        + "<head>"
                            + "<style>"
                                + "@-webkit-keyframes mymove {"
                                    + "from {top: 0px;}"
                                    + "to {top: 50px;}"
                                + "}"
                                + ".box { "
                                    + "width: 150px; "
                                    + "position: relative; "
                                    + "height: 150px; "
                                    + "background: red; "
                                    + "margin-top: 35px; "
                                    + "margin-left: auto; "
                                    + "margin-right: auto; "
                                    + "-webkit-transition: background-color 2s ease-out;  "
                                    + "-webkit-transition: all 1s ease-in-out; "
                                + "}"
                                +".box:hover {"
                                    +" background-color: green;"
                                    + "width:350px;"
                                    + "-webkit-animation: mymove 1s infinite;"
                                +"}"        
                            + "</style>"
                        + "</head>"
                        + "<body>"
                            + "<div class='box'></div>"
                        + "</body>"
                    + "</html>";

            webEngine.loadContent(pageContents);
            webView.setContextMenuEnabled(false);
            getChildren().add(webView);
        }
    }

    private Scene   scene;
    MyBrowser       myBrowser;

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        primaryStage.setTitle("Frontend");
        myBrowser = new MyBrowser();
        scene = new Scene(myBrowser);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Я подозреваю, что это связано с тем, что теперь они используют более новый веб-кит JDK-8156698, но это могло быть ошибкой раньше (вы можете взглянуть на исправлено 8u112 ошибок список.

person JavierJ    schedule 08.12.2016
comment
Попробую это и дам вам знать. Спасибо. :-) - person We are Borg; 21.12.2016

У меня была такая же проблема с рендерингом веб-приложения на основе angular с использованием webview. И я исправил ее, обновив версию Java до 1.8.0_121.

person Dila Gurung    schedule 03.12.2017