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

标签 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 守护进程):

=========== Performance Statistics =============
Time/Invocations count:
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      |
+-----------------+-----------+---------+

最佳答案

在深入研究 jfxrt.jar 几个小时后,在@NwDx 的帮助下反复试验,这里总结了正在发生的事情。

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

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

如果您粗心大意,可以使用:LogManager.getLogManager().reset() 来修复所有问题。更细心的患者可以继续阅读。

剪辑区域调试

有一些可视调试代码由 log.isLoggable(Level.FINE) 保护在 com.sun.webpane.sg.prism.WCGraphicsPrismContext 中。

这是此处提交的已知错误:https://bugs.openjdk.java.net/browse/JDK-8096483 查看修复版本:1.8.0u40 之前的任何版本都容易受到这种不需要的可视化调试的影响(参见相关表格)。在 1.8.0u40+ 中,您可以-Dcom.sun.webkit.debugDrawClipShape=true 启用此“功能”。

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

String name = com.sun.webpane.sg.prism.WCGraphicsPrismContext.class.getName();
java.util.logging.Logger.getLogger(name).setLevel(java.util.logging.Level.OFF);

PerfLogger 日志记录

如问题中所述,有一些诊断信息被输出到标准输出。 PerfLogger checks the FINE level以及。这些消息的来源如下:

  • com.sun.webpane.perf.WCGraphicsPerfLogger
  • com.sun.webpane.perf.WCFontPerfLogger
  • com.sun.webpane.platform.Invoker 命名为 Locks
  • TextBreakIteratorJavajfxwebkit.dll 中通过 LOG_PERF_RECORD 命名为 XXXX
    ...有人从字面上理解了这个例子,为什么? :(

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

java.util.logging.Logger.getLogger('com.sun.webpane.perf').setLevel(Level.OFF)

因为the package name is hardcoded或者 Logger 实例在该包中。

其他一切

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

有关更多信息,请参阅 our chat .

关于java - 为什么 JavaFX 的 WebView 闪烁红色和绿色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31094547/

相关文章:

java - Java 应用程序可以与 VB 应用程序集成吗?

java - 使用 JS/jQuery/AJAX 和 Controller 在 Java 中分页

mysql - 如何过滤 hashMap 的结果以选取以某个字母开头的所有键 Groovy

elasticsearch - Elasticsearch脚本-将Unix时间戳转换为 “YYYYMM”

android webview 显示凭据弹出窗口

html - 如何防止移动设备字体缩放

java - Go/Java中如何修改http请求中的ip地址

java - 日历对象有什么作用?

groovy - 如何在Groovy代码中使用Arrow-kt的Some()?

android - 使用 WebView android 读取 Gif 图像