我正在使用
JavaFX应用程序,其中包含由内部webkit浏览器呈现的几个html,css,JS文件.现在,问题是CSS动画在JavaFX提供的webkit浏览器中没有得到顺利的呈现,但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; } } }); } }
MyBrowser:
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; }
谢谢.
解决方法
尝试使用
Java 8u112,基于您的代码,我创建了一个工作示例(使用Java JDK 8u112 64位测试):
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(); } }
我怀疑这是因为他们现在正在使用一个较新的webkit JDK-8156698,但它可能是以前的错误(可以看看8u112 bug fixes列表.