Начало работы с разработкой настольных приложений Scala + JavaFX

17

Есть ли какое-нибудь руководство или пошаговое руководство для создания рабочего стола Scala + JavaFX?

Мне сложно найти хороший источник, и я использую IntelliJ IDEA в качестве среды 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 с меткой?

    
задан Tower 25.08.2012 в 20:37
источник
  • Вы успешно записали что-либо в JavaFX перед использованием только Java? Какую IDE вы использовали? –  Luigi Plinge 25.08.2012 в 21:40
  • @LuigiPlinge Нет, я только что нашел о JavaFX, и я начал изучать Scala месяц назад или около того. Я использую IntelliJ IDE. –  Tower 25.08.2012 в 22:11
  • Я бы начал, следуя примерам на веб-сайте Oracle. oracle.com/technetwork/java/javafx/documentation/index.html Убедитесь, что вы можете запустить его с помощью Java, а затем попробуйте перевести примеры в Scala. Вы также можете быть заинтересованы в ScalaFX, который является текущим проектом по созданию идиоматических привязок Scala для библиотеки. code.google.com/p/scalafx –  Luigi Plinge 26.08.2012 в 00:00
  • @LuigiPlinge Я обновил свой вопрос с помощью кода. Вы не знаете, как продолжить, с чего я остановился? –  Tower 26.08.2012 в 12:54

3 ответа

29

Есть несколько вещей, которые нужно знать при написании приложений JavaFX на основе Scala.

Во-первых, вот пример приложения 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: Ссылка

Основные отличия:

  • Вы должны написать так называемый объект-компаньон с def main() , который запускает фактическое приложение.
  • Вы должны указать, что он будет запущен в контексте класса Test, а не сопутствующего объекта: Application.launch(classOf[Test], args: _*) .

Если вы просто попытаетесь запустить приложение напрямую с Application.launch(args : _*) , вы получите эту ошибку:

  

Исключение в потоке "main" java.lang.RuntimeException: Ошибка: class   Тест $ не является подклассом   javafx.application.Application

Чтобы узнать больше о JavaFX, просто прочитайте официальную документацию: Ссылка

    
ответ дан Kai Sellgren 26.08.2012 в 15:39
источник
0

Я смог решить эту проблему в 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()
  }
}
    
ответ дан Bday 11.08.2016 в 17:54
источник
  • Stack Overflow не является форумом, поэтому ответы не могут содержать вопросов. Если у вас есть вопрос, пожалуйста, откройте новый вопрос и оставьте ответ в виде отдельного ответа. –  Brian Tompsett - 汤莱恩 13.08.2016 в 11:34
0

Вы можете использовать этот способ.

 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()

  }
}
    
ответ дан ABC 15.09.2017 в 22:29
источник