Как создать диаграмму без запуска приложения javaFX и сохранить ее в файл для дальнейшей обработки? - PullRequest
0 голосов
/ 02 июля 2019

Я хочу создать диаграмму и отправить изображение результата клиенту.Для этого варианта использования у меня есть простой сервис, который реализует класс Application и открытый метод для возврата имени файла результата.

3 проблемы:

  • Без stage.show ()и нажатие кнопки закрытия приложения ожидает какого-либо действия.

  • Я не могу получить имя файла результата.При вызове запуска статической функции из класса Appication он создает новый экземпляр.И результат всегда пустая строка.

  • Во время отладки я могу просмотреть временное имя файла.Когда я открываю его, я вижу пустую диаграмму.

    import javafx.application.Application
    import javafx.embed.swing.SwingFXUtils
    import javafx.scene.Scene
    import javafx.scene.chart.CategoryAxis
    import javafx.scene.chart.LineChart
    import javafx.scene.chart.NumberAxis
    import javafx.scene.chart.XYChart
    import javafx.scene.image.WritableImage
    import javafx.stage.Stage
    import java.nio.file.Files
    import javax.imageio.ImageIO
    import kotlin.random.Random
    
    fun main(args: Array<String>) {
      val someService = ChartService()
      println("Send image file name: ${someService.getImage()}")
    }
    
    class ChartService : Application() {
    
      private var measurements = List(10) { Random.nextInt(0, 50) }
    
      private var resultFileName: String = ""
    
      fun getImage(): String {
        launch(this.javaClass)
    
        return resultFileName
      }
    
      override fun start(stage: Stage) {
        val xAxis = CategoryAxis()
        val yAxis = NumberAxis()
    
        xAxis.label = "Time"
    
        //creating the chart
        val mayChart = LineChart<String, Number>(xAxis, yAxis)
        mayChart.title = "Chart"
    
        val aXSeries = XYChart.Series<String, Number>()
        aXSeries.name = "Legend"
    
        measurements.forEachIndexed { index: Int, data: Int ->
          aXSeries.data.add(XYChart.Data<String, Number>("$index", data))
        }
    
        val scene = Scene(mayChart, 800.0, 600.0)
        mayChart.data.addAll(aXSeries)
    
        stage.scene = scene
        stage.show()
    
        val image: WritableImage = scene.snapshot(null)
        val file = Files.createTempFile("", "")
        try {
          ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file.toFile())
        } catch (ex: Exception) {
        }
    
        resultFileName = file.toString()
      }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...