I'm just starting out with JavaFX, and I wanted to put a WebView into a Window:
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);
It looks ever so simple, but for some reason the draw regions are being highlighted with red and green when moving the mouse around. How can I disable the flashing colors?
Here's an extremely minimal repro
(put all this in a build.gradle
and run 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);
I just noticed that it outputs some logging after termination
(this was hidden before, probably because I used a Gradle daemon which swallowed it):
=========== Performance Statistics =============
Time/Invocations count:
com.sun.webpane.perf.WCFontPerfLogger.*: ...
com.sun.webpane.perf.WCGraphicsPerfLogger.*: ...
I'm using jdk1.7.0_80_x64/jre/lib/jfxrt.jar
on Windows 7 x64 Ultimate.
Tried the following Java versions I had on my computer:
+-----------------+-----------+---------+
| 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 |
+-----------------+-----------+---------+
After some hours of going deep into jfxrt.jar
, trial and error and with the help of @NwDx here's a summary of what's going on.
The Gradle build system messes with the JUL root logger and sets the default logging level to FINER
from the original INFO
. This activates a lot of internal mechanisms inside the JavaFX runtime. Most notably:
PerfLogger
s are dependent on some JUL Logger levelsIf you're careless you can use: LogManager.getLogManager().reset()
to fix everything. More careful patients may continue reading.
There's some visual debugging code guarded by a log.isLoggable(Level.FINE)
in com.sun.webpane.sg.prism.WCGraphicsPrismContext
.
It is a known bug filed here: https://bugs.openjdk.java.net/browse/JDK-8096483
Looking at the fix version: anything before 1.8.0u40 is susceptible to this unwanted visual debugging (see table in question). In 1.8.0u40+ you can -Dcom.sun.webkit.debugDrawClipShape=true
to enable this "feature".
To be on the safe side it's worth disabling the logging for that class either by configuring JUL or:
String name = com.sun.webpane.sg.prism.WCGraphicsPrismContext.class.getName();
java.util.logging.Logger.getLogger(name).setLevel(java.util.logging.Level.OFF);
As mentioned in the question there's some diagnostic info being spit out to stdout. PerfLogger
checks the FINE
level as well. The source of those messages are the following:
com.sun.webpane.perf.WCGraphicsPerfLogger
com.sun.webpane.perf.WCFontPerfLogger
com.sun.webpane.platform.Invoker
named Locks
TextBreakIteratorJava
in jfxwebkit.dll
is named XXXX
via the LOG_PERF_RECORDThe easiest way to disable this is:
java.util.logging.Logger.getLogger('com.sun.webpane.perf').setLevel(Level.OFF)
because the package name is hardcoded or the Logger
instances are in that package.
It's probably worth making the log level higher (INFO-OFF) for all com.sun.*
and javafx.*
packages to prevent further weirdness or performance degradation.
For any further info see our chat.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With