GithubHelp home page GithubHelp logo

scalafxml's Introduction

scalafxml

Build Status

The scalafx library is a great UI DSL that wraps JavaFX classes and provides a nice syntax to work with them from Scala.

This library bridges FXML and scalafx by automatically building proxy classes, enabling a more clear controller syntax.

Status

The main branch contains the initial implementation of the compile time proxy generator, which uses macro annotations. This requires the addition of the macro paradise compiler plugin, but has no runtime dependencies. It depends on ScalaFX 8 and JavaFX 8.

The SFX-2 branch is the compile time proxy generator for ScalaFX 2.2 using JavaFX 2.

On the dynamic branch there is the first version of the proxy generator which executes runtime. This has a disadvantage of having scala-compiler.jar as a dependency, but has no special compile-time dependencies.

The latest published version is 0.5. To use it in SBT with Scala 2.13 add

scalacOptions += "-Ymacro-annotations"

libraryDependencies += "org.scalafx" %% "scalafxml-core-sfx8" % "0.5"

for Scala 2.12 and earlier add:

addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)

libraryDependencies += "org.scalafx" %% "scalafxml-core-sfx8" % "0.5"

Example

The controller's, referenced from the FXML's through the fx:controller attribute, can be implemented as simple Scala classes, getting all the bound controls though the constructor:

import scalafx.scene.control.TextField
import scalafx.scene.control.Button
import scalafx.scene.control.ListView
import scalafx.event.ActionEvent
import scalafxml.core.macros.sfxml

@sfxml
class TestController(input: TextField,
                     create: Button,
                     recentInputs: ListView[String],
                     dep: AnAdditionalDependency) {

	// event handlers are simple public methods:
	def onCreate(event: ActionEvent) {
		// ...
	}
}

Accessing the controller

As the controller class is replaced in compile time by a generated one, we cannot directly use it to call the controller of our views. Instead we have to define a public interface for them and then use it as the type given for the getController method of FXMLLoader.

The example below shows this:

trait UnitConverterInterface {
  def setInitialValue(value: Double)
}

@sfxml
class UnitConverterPresenter(// ... 
                            )
  extends UnitConverterInterface {
  
  // ...
}

// Instead of FXMLView, we create a new ScalaFXML loader
val loader = new FXMLLoader(
  getClass.getResource("unitconverter.fxml"),
  // ...
  )
  
loader.load()

val root = loader.getRoot[jfxs.Parent]

val controller = loader.getController[UnitConverterInterface]
controller.setInitialValue(10)

stage = new JFXApp.PrimaryStage() {
  title = "Unit converter"
  scene = new Scene(root)
}

Nested controllers

Nested controllers can be used in a similar way as described above, by defining a public interface for them first, using this interface as the type of the injected value in the parent controller, but explicitly marking the original controller class with a @nested annotation.

The following example demonstrates this:

trait NestedControllerInterface {
  def doSomething(): Unit
}

@sfxml
class NestedController(label: Label) extends NestedControllerInterface {

  println(s"Nested controller initialized with label: $label")

  override def doSomething(): Unit = {
    label.text = "Nested controller called!"
    println("Nested controller called")
  }
}

@sfxml
class WindowController(nested: VBox,
                       @nested[NestedController] nestedController: NestedControllerInterface) {

  nestedController.doSomething()
}

Third party control libraries

scalafxml recognizes factory JavaFX and ScalaFX controls, and assumes everything else to be an external non-UI dependency to be get from a dependency provider. When using third party control libraries, there are two possibilities:

  • Listing the third party control package in the @sfxml annotation
  • Using the @FXML annotation for these controls

The following example shows how to do this with JFoenix using the first method:

@sfxml(additionalControls=List("com.jfoenix.controls"))
class TestController(input: JFXTextField,
                     create: JFXButton)

or with the second approach:

@sfxml
class TestController(@FXML input: JFXTextField,
                     @FXML create: JFXButton)

Dependency injection

Beside the JavaFX controls, additional dependencies can be injected to the controller as well. This injection process is extensible.

Simple

It is also possible to simply give the dependencies by their type or by their name:

object SimpleDemo extends JFXApp {

  stage = new JFXApp.PrimaryStage() {
    title = "Test window"
    scene = new Scene(
		FXMLView(getClass.getResource("test.fxml"),
		    new DependenciesByType(Map(
		      typeOf[AnAdditionalDependency] -> new AnAdditionalDependency("dependency by type"))))

  }
}

SubCut

The following example uses SubCut for injecting the additional dependency:

object SubCutDemo extends JFXApp {

  implicit val bindingModule = newBindingModule(module => {
    import module._

    bind [AnAdditionalDependency] toSingle(new AnAdditionalDependency("subcut dependency"))
  })

  stage = new JFXApp.PrimaryStage() {
    title = "Test window"
    scene = new Scene(
		FXMLView(
			getClass.getResource("test.fxml"),
			new SubCutDependencyResolver()))
  }
}

MacWire

The following example demonstrates how to use MacWire to inject additional dependencies:

object MacWireDemo extends JFXApp {

  class Module {
    def testDependency = TestDependency("MacWire dependency")
  }

  lazy val wired: Wired = wiredInModule(new Module)

  stage = new JFXApp.PrimaryStage() {
    title = "Hello world"
    scene = new Scene(
      FXMLView(getClass.getResource("startscreen.fxml"), 
      new MacWireDependencyResolver(wired)))
  }
}

Guice

The same example with Guice:

object GuiceDemo extends JFXApp {

  val module = new AbstractModule {
    def configure() {
      bind(classOf[TestDependency]).toInstance(new TestDependency("guice dependency"))
    }
  }
  implicit val injector = Guice.createInjector(module)

  stage = new JFXApp.PrimaryStage() {
    title = "Hello world"
    scene = new Scene(
      FXMLView(getClass.getResource("startscreen.fxml"), 
      new GuiceDependencyResolver()))
  }
}

Requirements

  • sbt 0.13 is required

Related

scalafxml's People

Contributors

jpsacha avatar scala-steward avatar suiryc avatar tobscore avatar vigoo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scalafxml's Issues

How to access the stage in a controller class?

With the annotation @sfxml, the controller class is separated from the stage variable. It seems that because of this separation, the stage variable becomes not accessible (since it is outside of the controller class).

This is often needed, as shown in the following example:

1    @sfxml
2    class MyController(val btnTest: Button) {
3      btnTest.onMouseClicked = { e: MouseEvent =>
4        val fileChooser = new FileChooser()
5        fileChooser.showSaveDialog(/*stage should be here*/)
6      }
7    }

Line 5 requires access to stage. Is there a way to do this in a controller annotated by @sfxml?

Scala 3 support?

Any chance that ScalaFXML can support Scala 3? Is it even feasible given that Scala 3 has no macro annotations?

HostServices as dependency

Hi,
I was trying to share the instance of hostServices with one of the my controllers, but I am getting constantly a nullPointerException

object Main extends JFXApp {

  val resource = getClass.getResource("/Views/main.fxml")

  val i18n = new PropertyResourceBundle(getClass.getResource("/i18n/en.properties").openStream)

  val my: HostServices = hostServices
  
  val loader = new FXMLLoader(resource, new DependenciesByType(Map(
                                  typeOf[HostServices] -> my))) {
    setResources(i18n)
  }

  val root = loader.load[javafx.scene.Parent]
  val controller = loader.getController[UnitController]

  stage = new PrimaryStage() {
    title = "Test"
    scene = new Scene(root)
  }

In MainController:

@sfxml
class MainController(val hostServices: HostServices) extends UnitController {
    println("HostServices: " + (hostServices.delegate== null))
  }
}

Although in MainController hostServices is NOT null, hostServices.delegate is null. Any idea?

Access FXMLLoader controller instance

I'm trying to access the controller instance of a loaded FXML in scala but haven't found a way to do it.
My code is sth like this:

@sfxml
class MyappController(var main: VBox) {
  def handleAbout() = {
    val loader = new FXMLLoader(getClass.getResource("/myapp/about.fxml"), NoDependencyResolver)
    val pane = loader.load[jfxsl.GridPane]
    val controller = loader.getController[AboutDialogController] // <<< ???? [Exception Line]
    val dialogStage = new Stage {
      scene = new Scene(pane)
    }
    ...
  }
}
@sfxml
class AboutDialogController(var pane: GridPane ) {
  ....

  def handleOk() = {
    println("Ok clicked")
  }
}

in the fxml file I have:

<GridPane  ... xmlns="http://javafx.com/javafx/8.0.60"
          xmlns:fx="http://javafx.com/fxml/1" fx:controller="sfxml.AboutDialogController"> ... </GridPane>

I get the following exception:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.ClassCastException: sfxml.AboutDialogController$Controller cannot be cast to sfxml.AboutDialogController
at sfxml.MyappController$Controller.handleAbout(... [Exception Line]... )
at sfxml.MyappController.handleAbout(...)

Bump MacWire version for dependency resolver

While it's great that there's a MacWire resolver provided now, the version used is pretty old - 1.0.7 vs the 2.2.4 current. In the meantime, there had been e.g. package renamings, which makes usage in scalafxml a pretty jarring experience.

Any specific reason why 1.0.7 was chosen?

Can't fix the compile error "overloaded method constructor Scene with alternatives"

Hello,

Now I'm trying scalafxml to refer to demo programs.
I'm completely stuck in the compile error bellow. I can't fix it.
Please help me.

I really appreciate your help with this situation.

$ sbt assembly
[info] Compiling 9 Scala sources to /home/ysksuzuki/IdeaProjects/app/target/scala-2.11/classes...
[error] /home/ysksuzuki/IdeaProjects/app/src/main/scala/app/Main.scala:21: overloaded method constructor Scene with alternatives:
[error]   (parent: scalafx.scene.Parent)scalafx.scene.Scene <and>
[error]   (delegate: javafx.scene.Scene)scalafx.scene.Scene
[error]  cannot be applied to (javafx.scene.Parent)
[error]     scene = new Scene(root)
[error]             ^

Here is my Main class and build.sbt.
I'm using sbt 0.13.8.

package app

import java.io.IOException
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.image.Image
import scalafxml.core.{NoDependencyResolver, FXMLView}

object Main extends JFXApp {

  val resource = getClass.getResource("RootLayout.fxml")
  if (resource == null) {
    throw new IOException("Cannot load resource: RootLayout.fxml")
  }

  val root = FXMLView(resource, NoDependencyResolver)

  stage = new JFXApp.PrimaryStage() {
    title = "APP"
    scene = new Scene(root)
    icons.add(new Image("file:resources/images/icon.png"))
  }
}
import AssemblyKeys._

name := "app"

version := "1.0"

scalaVersion := "2.11.6"

licenses := Seq("MIT License" -> url("http://opensource.org/licenses/mit-license.php/"))

scalacOptions ++= (
  "-language:postfixOps" ::
    "-language:implicitConversions" ::
    "-language:higherKinds" ::
    "-language:existentials" ::
    "-deprecation" ::
    "-unchecked" ::
    "-Xlint" ::
    "-Ywarn-unused-import" ::
    "-Ywarn-unused" ::
    Nil
  )

resolvers += Opts.resolver.sonatypeReleases

resolvers += Resolver.url("typesafe", url("http://repo.typesafe.com/typesafe/ivy-releases/"))(Resolver.ivyStylePatterns)

addCompilerPlugin("org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full)

libraryDependencies ++= (
    ("org.scalafx" %% "scalafx" % "8.0.20-R6") ::
    ("org.scalafx" %% "scalafxml-core-sfx8" % "0.2.2") ::
    ("org.apache.httpcomponents" % "httpclient" % "4.2.1") ::
    ("org.scala-lang.modules" %% "scala-xml" % "1.0.2") ::
    ("com.github.scala-incubator.io" %% "scala-io-core" % "0.4.3") ::
    ("com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3") ::
    ("com.typesafe" % "config" % "1.2.1") ::
    ("com.typesafe.scala-logging" %% "scala-logging" % "3.1.0") ::
    ("ch.qos.logback" % "logback-classic" % "1.0.7") ::
    ("org.scala-sbt" %% "io" % sbtVersion.value) ::
    ("org.scalatest" % "scalatest_2.11" % "2.2.1" % "test") ::
    Nil
  )

assemblySettings

jarName in assembly := { s"${name.value}.jar" }

How to create a distributable package

Hi,

I am using this template for my project. The build system is too complex for my brain, how do I make a distributable app with a packager? I am fighting with sbt native packager but can't seem to figure out what is where :(

It would be awesome for new comers if the build config also includes config for packaging.

Multiple (class/traits) inheritance not supported

Currently inheriting from more that one class/trait does not work. For example:

trait A

trait B

@sfxml
class MyClass extends A with B

fails with the following error

[ERROR] /path/to/MyClass.scala:7: exception during macro expansion: 
scala.MatchError: class MyClass extends A with B {
  def <init>() = {
    super.<init>();
    ()
  }
} (of class scala.reflect.internal.Trees$ClassDef)
    at scalafxml.core.macros.sfxmlMacro$.impl(sfxmlMacro.scala:90)

[ERROR] @sfxml
[ERROR]  ^

As a workaround, one can define an intermediary class/trait which extends the others:

trait MyClassTraits extends A with B

@sfxml
class MyClass extends MyClassTraits

After searching the cause, found some hints here and there.

When using custom controls from a library they aren't "linked" to the controls in a stage

Here's my repository

I am using JFoenix for Material Design elements.

FXML in question:

<HBox alignment="TOP_CENTER" prefHeight="100.0" BorderPane.alignment="CENTER">
	<children>
		<JFXButton fx:id="changeport" alignment="CENTER" buttonType="RAISED" contentDisplay="CENTER" graphicTextGap="8.0" style="-fx-text-fill: WHITE; -fx-background-color: #5264AE;" text="CHANGE PORT" textAlignment="CENTER" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1">
			<font>
				<Font name="Roboto" size="14.0" />
			</font>
		</JFXButton>
		<Label fx:id="iptext" text="Your local IP is: " textAlignment="CENTER">
			<font>
				<Font name="Roboto" size="24.0" />
			</font>
			<HBox.margin>
				<Insets left="20.0" />
			</HBox.margin>
		</Label>
	</children>
	<BorderPane.margin>
		<Insets bottom="50.0" />
	</BorderPane.margin>
</HBox>

Now in the code:

@sfxml
class MainMenu(
                @FXML private val rootpane: StackPane,
                @FXML private val list: JFXListView[Connection],
                @FXML private val ip: JFXTextField,
                @FXML private val port: JFXTextField,
                @FXML private val connect: JFXButton,
                @FXML private val changeport: JFXButton,
                @FXML private val iptext: Label,
                @FXML private val dialog: JFXDialog,
                @FXML private val pchange: JFXTextField,
                @FXML private val accept: JFXButton
              ) {


  rootpane.getChildren.remove()

  pchange.textProperty.addListener((observable, oldValue, _) => {
    if (!observable.asInstanceOf[StringProperty].get().matches("\\d{,5}")) {
      observable.asInstanceOf[StringProperty].setValue(oldValue)
    }
  })
  accept.setOnMouseClicked((_: MouseEvent) => {
    msg.Connection.setPort(pchange.getText.toInt)
  })

  iptext.setText("Your local IP is: " + InetAddress.getLocalHost.getHostAddress + ":" + msg.Connection.getPort)
  changeport.setOnMouseClicked((_: MouseEvent) => {
    println("pls")
    dialog.setTransitionType(DialogTransition.CENTER)
    dialog.show(rootpane)
  })
  println(changeport.getText)

}

setting iptext's text works fine, but doing anything with the JFeonix elements does not work.

I define them here:

object Main extends JFXApp {

  stage = new application.JFXApp.PrimaryStage {
    title = "P2P Client"
    scene = new Scene(
      new jfxs.Scene(
        FXMLView(
          getClass.getResource("/fxml/main_menu.fxml"),
          new DependenciesByType(
            Map(
              typeOf[JFXButton] -> new JFXButton(),
              typeOf[JFXTextField] -> new JFXTextField(),
              typeOf[JFXListView[Connection]] -> new JFXListView[Connection]()
            )
          )
        )
      )
    )
  }

}

Why aren't any of these working? Is this me being dumb or an SFXML bug?

Storing Instances via a Object Singleton

Assuming you have a @sfxml controller defined like this

@sfxml
class SomeController(
    private val someTextField:TextField,
    private val dep:Dependency
) {
    // Do stuff here
    SomeControllerFactory.get = Option(this)
}

object SomeControllerFactory {
    var get:Option[SomeController] = None
}

The following generates a compile time error like this

[error] /Users/matthewdedetrich/example/src/main/scala/com/example/SomeController.scala:37: type mismatch;
[error]  found   : SomeController.this.Controller
[error]  required: com.example.SomeController
[error]   SomeControllerFactory.get = Option(this)

Using a companion object (i.e. object SomeController instead of object SomeControllerFactory) doesn't seem to work either, you would get the following

Compiling ScalaFXML proxy class for SomeController
[error] /Users/matthewdedetrich/example/src/main/scala/com/example/SomeController.scala:16: top-level class with companion can only expand into a block consisting in eponymous companions
[error] @sfxml

If you are wondering, I am trying to retrieve an store an Instance of SomeController (there is only going to be one instance of SomeController in my app) in a singleton object, so I can access it from outside of SomeController (i.e. some other controller does some action, and I want to access the instance of SomeController to do something to it)

@sfxml generates a NullPointerException

I have no idea how to debug or approach what's going on here. Any help would be most appreciated. I'm using sbt 0.13.6, jdk1.8.0_20, and Scala 2.11.2

I'm trying to create the following controller:

@sfxml
class MainWindowController(private val submit_button: Button)
{
  def refreshAvailableSerialPorts(event: ActionEvent): Unit = {
    println("REFRESH")
  }

  def submit(event: ActionEvent): Unit = {
    println("SUBMIT")
  }

  def handleApplicationExit(event: ActionEvent): Unit = {
    Platform.exit()
  }
}

And I get this trackback:

java.lang.NullPointerException
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser$$anonfun$1.isDefinedAt(Dependency.scala:132)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser$$anonfun$1.isDefinedAt(Dependency.scala:131)
    at xsbt.Dependency$CollectTypeTraverser.traverse(Dependency.scala:89)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:134)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:104)
    at scala.reflect.api.Trees$Traverser.traverseTypeAscription(Trees.scala:2478)
    at scala.reflect.internal.Trees$$anonfun$traverseMemberDef$1$1.apply$mcV$sp(Trees.scala:1207)
    at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
    at scala.reflect.internal.Trees$class.traverseMemberDef$1(Trees.scala:1196)
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1321)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:149)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:104)
    at scala.reflect.api.Trees$Traverser.traverseTrees(Trees.scala:2484)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:138)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:104)
    at scala.reflect.internal.Trees$$anonfun$traverseMemberDef$1$1.apply$mcV$sp(Trees.scala:1200)
    at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
    at scala.reflect.internal.Trees$class.traverseMemberDef$1(Trees.scala:1196)
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1321)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:149)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:104)
    at scala.reflect.api.Trees$Traverser.traverseTrees(Trees.scala:2484)
    at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1277)
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1323)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:149)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:146)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:104)
    at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2498)
    at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
    at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2497)
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1319)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
    at xsbt.Dependency$ExtractDependenciesByMemberRefTraverser.traverse(Dependency.scala:149)
    at xsbt.Dependency.xsbt$Dependency$$extractDependenciesByMemberRef(Dependency.scala:155)
    at xsbt.Dependency$DependencyPhase$$anonfun$run$2.apply(Dependency.scala:42)
    at xsbt.Dependency$DependencyPhase$$anonfun$run$2.apply(Dependency.scala:38)
    at scala.collection.Iterator$class.foreach(Iterator.scala:743)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1177)
    at xsbt.Dependency$DependencyPhase.run(Dependency.scala:38)
    at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1557)
    at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1542)
    at scala.tools.nsc.Global$Run.compileSources(Global.scala:1537)
    at scala.tools.nsc.Global$Run.compile(Global.scala:1644)
    at xsbt.CachedCompiler0.run(CompilerInterface.scala:116)
    at xsbt.CachedCompiler0.run(CompilerInterface.scala:95)
    at xsbt.CompilerInterface.run(CompilerInterface.scala:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
    at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:47)
    at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:41)
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply$mcV$sp(AggressiveCompile.scala:97)
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:97)
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:97)
    at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:162)
    at sbt.compiler.AggressiveCompile$$anonfun$3.compileScala$1(AggressiveCompile.scala:96)
    at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:139)
    at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:86)
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:38)
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:36)
    at sbt.inc.IncrementalCommon.cycle(IncrementalCommon.scala:31)
    at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:39)
    at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:38)
    at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:66)
    at sbt.inc.Incremental$.compile(Incremental.scala:38)
    at sbt.inc.IncrementalCompile$.apply(Compile.scala:26)
    at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:153)
    at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:70)
    at sbt.compiler.AggressiveCompile.apply(AggressiveCompile.scala:45)
    at sbt.Compiler$.apply(Compiler.scala:74)
    at sbt.Compiler$.apply(Compiler.scala:65)
    at sbt.Defaults$.sbt$Defaults$$compileTaskImpl(Defaults.scala:777)
    at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:769)
    at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:769)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[error] (compile:compile) java.lang.NullPointerException

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.