1

I'd not normally ask for help here, but I'm stumped - this bug is the strangest thing I've seen in a long time.

https://gfycat.com/FluidFrigidEastsiberianlaika

I've got a simple UI object called GhostProgressBar that extends ScalaFX.StackPane and gives it two children - a ProgressBar and a Label. I noticed after adding it to some other UI screens that my framerate had plummeted, to a point where the UI was painfully unusuable.

The code for this is super simple:

import scalafx.geometry.Pos
import scalafx.scene.control.{Label, ProgressBar}
import scalafx.scene.layout.StackPane

class GhostProgressBar extends StackPane {

  alignment = Pos.Center

  val bar = new ProgressBar() {
    prefWidth = Integer.MAX_VALUE
  }
  val text = new Label() {
    id = "ProgressBarText"
    text = "PERFORMANCE TESTING"
  }

  children = List(bar, text)
}

In the GIF I'm using it inside a VBox that's the center element of a regular BorderPane - nothing strange or atypical.

From the behaviour I've observed, I think it's an issue with text being drawn over the bar of the ProgressBar. Just now I've done some more debugging, and my suspicions that it was related to the styling of the text were confirmed.

This is the styling that's on the text in the GIF.

#ProgressBarText {
    -fx-text-fill: #dddddd;
    -fx-font-weight: bold;
}
#ProgressBarText .text {
    -fx-stroke: #333333;
    -fx-stroke-width: 1px;
    -fx-stroke-type: outside;
}

When I remove that styling, the framerate doesn't drop when the bar hits the text.

What I can't figure out is why this is happening? Anyone got any ideas? I have no idea if it's a Scala thing, or a ScalaFX thing, whether or not it's reproducible with the same stuff in a JavaFX context.

Help would be appreciated.

EDIT: I was asked for versions, here we go:

  • Scala version: 2.12.7
  • ScalaFX version: 8.0.102-R11
  • JDK version: 1.8.0_181
  • JavaFX version: unknown, I'm not familiar with ScalaFX's internals and I'm not using JavaFX directly.

EDIT 2: I was asked to try the same screen elements, but using JavaFX elements instead of ScalaFX ones. Here's the code I used, the outcome was the same - whenever the outlined text was over the progress bar's bar, the framerate dropped.

import javafx.geometry.Pos
import javafx.scene.control.{Label, ProgressBar}
import javafx.scene.layout.StackPane

class JavaFXGhostProgressBar extends StackPane {

    this.setAlignment(Pos.CENTER)

    val bar = new ProgressBar()
    bar.setMaxWidth(Double.MaxValue)
    val text = new Label()
    text.textProperty().setValue("PERFORMANCE TESTING")
    text.idProperty().setValue("OutlineProgressBarText")

    this.getChildren.addAll(bar, text)
}

I couldn't find out what version of JavaFX I used here; IntelliJ was weirdly inconsiderate in not telling me. I couldn't find it in my external libraries list, either.

Mike Allen
  • 8,139
  • 2
  • 24
  • 46
  • Very odd! I strongly suspect that _Scala_ & _ScalaFX_ aren't the issues. It's more likely to be an issue inside _JavaFX_. Can you try writing `GhostProgressBar` using the _JavaFX_ version of the elements? Which versions of _JDK_, _Scala_, _ScalaFX_ and _JavaFX_ are you using? – Mike Allen Nov 29 '18 at 13:57
  • @MikeAllen Edited the question to answer your questions. –  Nov 29 '18 at 23:18
  • 1
    Oracle's JDK 8 includes JavaFX 8, so that's the version you have. Given your update, it looks like this is a _JavaFX_ issue. I'll add the appropriate tag to your question in case anyone else knows what's going on. Otherwise, you might want to review the [official bug list](https://github.com/javafxports/openjdk-jfx/issues) and possibly report your issue there. – Mike Allen Nov 29 '18 at 23:42

0 Answers0