【问题标题】:Open and close JavaFx apps in scala console在 Scala 控制台中打开和关闭 JavaFx 应用程序
【发布时间】:2015-12-14 07:21:13
【问题描述】:

这是一个例子:

/*
 * Copyright 2013 ScalaFX Project
 * All right reserved.
 */
package scalafx.ensemble.example.charts

import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.collections.ObservableBuffer
import scalafx.scene.chart.LineChart
import scalafx.scene.chart.NumberAxis
import scalafx.scene.chart.XYChart

/** A chart in which lines connect a series of data points. Useful for viewing
  * data trends over time.
  *
  * @see scalafx.scene.chart.LineChart
  * @see scalafx.scene.chart.Chart
  * @see scalafx.scene.chart.Axis
  * @see scalafx.scene.chart.NumberAxis
  * @related charts/AreaChart
  * @related charts/ScatterChart
  */
object BasicLineChart extends JFXApp {

  stage = new JFXApp.PrimaryStage {
    title = "Line Chart Example"
    scene = new Scene {
      root = {

        val xAxis = NumberAxis("Values for X-Axis", 0, 3, 1)
        val yAxis = NumberAxis("Values for Y-Axis", 0, 3, 1)

        // Helper function to convert a tuple to `XYChart.Data`
        val toChartData = (xy: (Double, Double)) => XYChart.Data[Number, Number](xy._1, xy._2)

        val series1 = new XYChart.Series[Number, Number] {
          name = "Series 1"
          data = Seq(
            (0.0, 1.0),
            (1.2, 1.4),
            (2.2, 1.9),
            (2.7, 2.3),
            (2.9, 0.5)).map(toChartData)
        }

        val series2 = new XYChart.Series[Number, Number] {
          name = "Series 2"
          data = Seq(
            (0.0, 1.6),
            (0.8, 0.4),
            (1.4, 2.9),
            (2.1, 1.3),
            (2.6, 0.9)).map(toChartData)
        }

        new LineChart[Number, Number](xAxis, yAxis, ObservableBuffer(series1, series2))
      }
    }
  }
}

object Main {
  BasicLineChart.main(Array(""))
}

我将BasicLineChart.main(Array("")) 行发送到控制台,JavaFx 窗口出现,其中包含折线图,控制台被阻止。当我关闭图表窗口时,我恢复了对 scala 控制台的访问。当我尝试再次启动同一个窗口时,出现错误:

scala>   BasicLineChart.main(Array(""))
java.lang.IllegalStateException: Application launch must not be called more than once
  at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:162)
  at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:143)
  at javafx.application.Application.launch(Application.java:191)
  at scalafx.application.JFXApp$class.main(JFXApp.scala:242)
  at BasicLineChart$.main(<console>:23)
  ... 35 elided

所以我有两个问题:

  1. 如何在控制台中无阻塞地启动 JavaFx 应用程序?

  2. 如何避免上述错误?


更新 1

根据 freenode 的一些建议,我将 BasicLineChart 更改为一个类并这样做:

object Main {
  val x = new BasicLineChart()
  x.main(Array(""))
  val y = new BasicLineChart()
  y.main(Array(""))
}

仍然出现同样的错误。

【问题讨论】:

    标签: scala javafx scalafx


    【解决方案1】:

    在问题 2 中,快速查看 JFXApp 它会调用 javafx.application.Application.launch,文档 here。该页面描述了生命周期,表明启动只能被调用一次。基本上,JFXApp 期望成为整个应用程序的入口点,因此不应多次调用。

    如果您希望能够快速重新启动您的应用,我会考虑使用 run 或 runMain 从 SBT 运行它,而不是使用控制台。

    关于问题 1,如果您决定从 SBT 运行,您应该可以在运行中进行 fork,SBT docs 中有详细信息,具体尝试将 fork in run := true 添加到 build.sbt

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      相关资源
      最近更新 更多