1

What can be the reason for getting this error in run-time (see title) while referring to ScalaFx class, instead if I switch to JavaFx class reference (workaround) things work as expected? With Scala 2.12 and ScalaFx 8.0.192-R14 things were working without JavaFx based workaround. About the environment: Scala 2.13.1, ScalaFx 12.0.2-R18, IntelliJ 2019.3.2, Java 8, Windows 10. Below I am providing the core snippets hopefully able to highlight the issue.

With ScalaFx MouseEvent class reference it seems to generate the exception with me.button:

import scalafx.Includes._    
import scalafx.scene.input.{MouseButton, MouseEvent}
...
    def flowPaneEvents(flowpane: FlowPane): Unit = {
      flowpane.onMouseClicked = (me: MouseEvent) => {
        // this statement causes the exception with scalafx
        me.button match {
          case MouseButton.Primary   => println("primary button")
          case MouseButton.Secondary => println("secondary button")
          case _ =>
        }
        me.consume()
      }
    }

Whereas referring to javaFx classes things are working fine. See below:

import scalafx.Includes._    
import javafx.scene.{input => jfxsi}
...
def flowPaneEvents(flowpane: FlowPane): Unit = {
  flowpane.onMouseClicked = (me: MouseEvent) => {
    // this javafx based reference gets things done
    me.getButton match {
      case jfxsi.MouseButton.PRIMARY => println("primary button")
      case jfxsi.MouseButton.SECONDARY => println("secondary button")
      case _ =>
    }
    me.consume()
  }
}

What am I missing (I've tried to re-import sbt library-dependencies, but I've not been lucky so far)?

1 Answers1

1

ScalaFX 12.0.2 is to be used with JavaFX 12. If you are using it with Java 8 you will run into strange issues when you have JavaFX 8 is in the path. Use ScalaFX 8 for Java 8. This is clearly stated on the project website: https://github.com/scalafx/scalafx#scalafx-8

Field "BACK" was added in JavaFX 12. See API documentation here: https://openjfx.io/javadoc/12/javafx.graphics/javafx/scene/input/MouseButton.html#BACK It is not present in JavaFX 8, so that is the reason for "java.lang.NoSuchFieldError: BACK" - ScalaFX is trying to access field that is not present.

Jarek
  • 1,513
  • 9
  • 16
  • This is logical as it is also documented. Nevertheless knowing the root issue now, I'll try to survive over the project with some JavaFx "fillings" as seen above hoping my wings won't burn too much... –  Jan 27 '20 at 22:12