开始使用Scala + JavaFX桌面应用程序开发

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (70)

是否有关于构建Scala+JavaFX桌面应用程序的指南或演练?

我很难找到一个好的源代码,我正在使用IntelliJIDEA作为IDE。

即使是最简单的桌面Hello World示例也会有很大帮助,因为我几乎不知道从哪里开始。

最新情况:这就是我现在拥有的:

import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import javafx.stage.Stage
import javafx.scene.control.Label

class Test extends Application {
  override def start(primaryStage: Stage) {
    primaryStage.setTitle("Sup!")

    val root = new StackPane
    root.getChildren.add(new Label("Hello world!"))

    primaryStage.setScene(new Scene(root, 300, 300))
    primaryStage.show()
  }
}

object Test {
  def main(args: Array[String]) {
    val t = new Test
    t.start(new Stage)
  }
}

运行它我得到:

线程“main”中的异常java.lang.IllegalStateException:不在FX应用程序线程上;currentThread=main

我怎样才能让它用标签显示Hello World窗口?

提问于
用户回答回答于

编写基于Scala的JavaFX应用程序时需要了解一些事情。

首先,这里是一个示例hello world应用程序:

import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import javafx.stage.Stage
import javafx.scene.control.Label

class Test extends Application {
  println("Test()")

  override def start(primaryStage: Stage) {
    primaryStage.setTitle("Sup!")

    val root = new StackPane
    root.getChildren.add(new Label("Hello world!"))

    primaryStage.setScene(new Scene(root, 300, 300))
    primaryStage.show()
  }
}

object Test {
  def main(args: Array[String]) {
    Application.launch(classOf[Test], args: _*)
  }
}

运行它你应该得到:

以下是Java中的官方hello世界示例:http : //docs.oracle.com/javafx/2/get_started/hello_world.htm

主要区别是:

  • 您必须编写与def main()启动实际应用程序的所谓伴侣对象。
  • 您必须指定它将在类Test的上下文中运行,而不是伴随对象:Application.launch(classOf[Test], args: _*)

如果你只是试图直接运行应用程序,Application.launch(args : _*)你会得到这个错误:

线程“main”中的异常java.lang.RuntimeException:错误:class Test $不是javafx.application.Application的子类

要了解有关JavaFX的更多信息,请阅读官方文档:http : //docs.oracle.com/javafx/index.html

用户回答回答于

我能够更加满意地解决scala_swing中的这个问题,因为您可以使用参数实例化一个实例,然后调用main来稍后启动Swing。

该解决方案允许在FX应用程序中使用静态变量和其他可能的问题来获取参数。一个是,这肯定不是多线程安全的。

package hack

/**
  * Created by WorkDay on 8/11/16.<br>
  * <br>
  * HelloTest shows a method which allows parameters to be passed
  * into your javaFX application as it is started
  * this allows it to be connected to non-FX code that existed before it.
  *
  * You could also pass a reference to the Application back
  * into the non-FX code if needed.
  */

import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import javafx.stage.Stage
import javafx.scene.control.Label

case class Data(data: String)

object SomeOtherCode extends App {
  HelloTest.launch(Data("brave"), Data("new"))
}

object HelloTest {
  var data1: Data = _
  var data2: Data = _
  def launch(data1: Data, data2: Data) = {
    HelloTest.data1 = data1
    HelloTest.data2 = data2
    Application.launch(classOf[HelloTest])
  }
}

private class HelloTest extends Application {
  val data1: Data = HelloTest.data1
  val data2: Data = HelloTest.data2


  override def start(primaryStage: Stage) {
    primaryStage.setTitle("Sup!")

    val root = new StackPane
    root.getChildren.add(new Label(s"Hello ${data1.data} ${data2.data} world!"))

    primaryStage.setScene(new Scene(root, 300, 300))
    primaryStage.setX(0)
    primaryStage.setY(0)
    primaryStage.show()
  }
}

扫码关注云+社区

领取腾讯云代金券