18

Scala + JavaFXデスクトップアプリケーションを構築するためのガイドやチュートリアルはありますか?

良いソースを見つけるのに苦労していて、IDEとしてIntelliJIDEAを使用しています。

最も単純なデスクトップのHelloWorldサンプルでさえ、どこから始めればよいかわからないため、大いに役立ちます。

更新:これは私が今持っているものです:

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

ラベル付きのHelloWorldウィンドウを表示するにはどうすればよいですか?

4

3 に答える 3

34

ScalaベースのJavaFXアプリケーションを作成する際に知っておくべきことがいくつかあります。

まず、HelloWorldアプリのサンプルを次に示します。

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での公式のhelloworldの例です: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:エラー:クラスTest$はjavafx.application.Applicationのサブクラスではありません

JavaFXの詳細については、公式ドキュメントをお読みください:http: //docs.oracle.com/javafx/index.html

于 2012-08-26T13:39:17.493 に答える
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()

  }
}
于 2017-09-15T20:29:47.787 に答える
0

パラメータを使用してインスタンスをインスタンス化し、そのインスタンスでmainを呼び出して後でSwingを開始できるため、scala_swingでこの問題をはるかに満足に解決することができました。

このソリューションでは、静的変数やその他の問題を使用する代わりに、FXアプリケーションでパラメーターを取得できます。1つは、これは確かにマルチスレッドセーフではないということです。

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()
  }
}
于 2016-08-11T15:54:06.097 に答える