Я хочу создать диаграмму и отправить изображение результата клиенту.Для этого варианта использования у меня есть простой сервис, который реализует класс 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()
}
}