为什么JavaFX的WebView会闪烁红色和绿色?

时间:2015-06-27 23:22:54

标签: java groovy webview gradle javafx

我刚开始使用JavaFX,我想把一个WebView放到一个窗口中:

public static class HelloJavaFXWeb extends Application {
    @Override public void start(Stage stage) throws Exception {
        final Group root = new Group();
        Scene scene = new Scene(root, Color.DODGERBLUE);
        WebView webView = new WebView();
        webView.getEngine().load("http://www.google.com");
        root.getChildren().add(webView);

        stage.setTitle("HelloWorld in JavaFX 2.0");
        stage.setScene(scene);
        stage.show();
    }
}

Application.launch(HelloJavaFXWeb.class);

它看起来如此简单,但由于某种原因,当移动鼠标时,绘制区域会以红色和绿色突出显示。如何禁用闪烁的颜色?

moving mouse over the WebView

更新:问题在于Groovy / Gradle交互

这是一个非常极小的复制品 (将所有这些放在build.gradle并运行gradle tasks --no-daemon):

buildscript {
    dependencies {
        def jvm = org.gradle.internal.jvm.Jvm.current()
        if (jvm.javaVersion.isJava7()) {
            classpath files("${jvm.jre.homeDir}/lib/jfxrt.jar")
        }
    }
}

import javafx.application.*;
import javafx.scene.*;
import javafx.scene.paint.Color;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

class HelloJavaFXWeb extends Application {
    @Override public void start(Stage stage) throws Exception {
        final Group root = new Group();
        Scene scene = new Scene(root, Color.DODGERBLUE);
        WebView webView = new WebView();
        webView.getEngine().load("http://www.google.com");
        root.getChildren().add(webView);

        stage.setTitle("HelloWorld in JavaFX 2.0");
        stage.setScene(scene);
        stage.show();
    }
}

Application.launch(HelloJavaFXWeb.class);

我刚注意到它在终止后输出了一些记录 (这之前是隐藏的,可能是因为我使用了吞下它的Gradle守护进程):

  

===========表现统计=============
  时间/调用次数:
  com.sun.webpane.perf.WCFontPerfLogger。*:...
  com.sun.webpane.perf.WCGraphicsPerfLogger。*:...

我在Windows 7 x64 Ultimate上使用jdk1.7.0_80_x64/jre/lib/jfxrt.jar

尝试了我在计算机上使用的以下Java版本:

+-----------------+-----------+---------+
|     version     | flashing  | logging |
+-----------------+-----------+---------+
| jdk1.7.0_05_x86 |      no JavaFX      |
| jdk1.7.0_80_x64 | yes       | yes     |
| jdk1.7.0_80_x86 | yes       | no      |
| jre1.7.0_80_x86 | yes       | no      |
| jre1.7.0_80_x64 | yes       | no      |
| jre1.8.0_45_x86 | no        | no      |
| jre1.8.0_45_x64 | no        | no      |
+-----------------+-----------+---------+

1 个答案:

答案 0 :(得分:2)

经过几个小时的深入jfxrt.jar,试验和错误,并在@NwDx的帮助下,这是对正在发生的事情的总结。

Gradle构建系统与JUL根记录器混淆,并将默认日志记录级别设置为原始FINER的{​​{1}}。这会激活JavaFX运行时内部的许多内部机制。最值得注意的是:

  • 剪辑区域调试取决于JUL Logger
  • INFO取决于某些JUL记录器级别
  • 许多其他不必要的日志记录,可能是/ dev / null

如果您不小心,可以使用:PerfLogger来解决所有问题。更细心的患者可能会继续阅读。

剪辑区域调试

LogManager.getLogManager().reset()中的log.isLoggable(Level.FINE)保护了一些可视调试代码。

这是一个已知的错误:https://bugs.openjdk.java.net/browse/JDK-8096483 查看修复版本:1.8.0u40之前的任何内容都容易受到这种不必要的可视化调试的影响(参见相关表格)。在1.8.0u40 +中,您可以com.sun.webpane.sg.prism.WCGraphicsPrismContext启用此“功能”。

为了安全起见,通过配置JUL或以下方法来禁用该类的日志记录是值得的:

-Dcom.sun.webkit.debugDrawClipShape=true

PerfLogger记录

正如问题所述,有一些诊断信息正在向stdout吐出。 PerfLogger checks the FINE level也是如此。这些消息的来源如下:

  • String name = com.sun.webpane.sg.prism.WCGraphicsPrismContext.class.getName(); java.util.logging.Logger.getLogger(name).setLevel(java.util.logging.Level.OFF);
  • com.sun.webpane.perf.WCGraphicsPerfLogger
  • com.sun.webpane.perf.WCFontPerfLogger名为com.sun.webpane.platform.Invoker
  • {li> TextBreakIteratorJavaLocks中通过LOG_PERF_RECORD来命名为jfxwebkit.dll ......有人从字面上看过这个例子,为什么? :(

禁用此功能的最简单方法是:

XXXX

因为the package name is hardcodedjava.util.logging.Logger.getLogger('com.sun.webpane.perf').setLevel(Level.OFF) 个实例位于该包中。

其他地方

可能值得为所有Loggercom.sun.*软件包提高日志级别(INFO-OFF),以防止进一步的怪异或性能下降。

如需了解更多信息,请参阅our chat