是否有一些指南或演练来构建Scala + JavaFX桌面应用程序?
我很难找到一个好的来源,我使用IntelliJ IDEA作为IDE。
即使是最简单的桌面问候世界样本也会有很多帮助,因为我几乎无法从哪里开始。
更新:这就是我现在所拥有的:
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窗口?
答案 0 :(得分:30)
编写基于Scala的JavaFX应用程序时需要了解一些事项。
首先,这是一个示例hello world app:
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 world示例:http://docs.oracle.com/javafx/2/get_started/hello_world.htm
主要区别是:
def main()
编写所谓的伴随对象。Application.launch(classOf[Test], args: _*)
。如果您只是尝试使用Application.launch(args : _*)
直接运行应用程序,则会收到此错误:
线程“main”中的异常java.lang.RuntimeException:错误:类 Test $不是它的子类 javafx.application.Application
要了解有关JavaFX的更多信息,请阅读官方文档:http://docs.oracle.com/javafx/index.html
答案 1 :(得分:1)
你可以用这种方式。
class BuildFx extends Application{
override def start(primaryStage: Stage): Unit = {
primaryStage.setTitle("Scala")
var btn=new Button("Say Hello Scala")
val root=new StackPane()
root.getChildren().add(btn)
primaryStage.setScene(new Scene(root, 300, 300))
primaryStage.show()
}
def launchIt():Unit={
Application.launch()
}
}
///////////////////////////////////////////////////////////
object Init{
def main(args: Array[String]): Unit = {
val buildFx=new BuildFx
buildFx.launchIt()
}
}
答案 2 :(得分:0)
我能够更加令人满意地解决scala_swing中的这个问题,因为您可以使用参数实例化一个实例,然后在其上调用main以稍后启动Swing。
此解决方案允许在FX应用程序中获取参数,但代价是使用静态var和可能的其他问题。一个是这肯定不是多线程安全的。
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()
}
}