2017-10-18 4 views
0

Je travaille sur un échantillon de code graphique en ligne:Scalafx: créer LineChart dans scala

import scalafx.application.JFXApp 
    import scalafx.stage.Stage 
    import scalafx.scene.Scene 
    import scalafx.scene.chart.{LineChart,NumberAxis, XYChart} 
    import scalafx.collections.ObservableBuffer 
    import scalafx.scene.chart.XYChart.Series 



    object LineChartSample extends JFXApp { 

    // Defining the axes 
    val xAxis = new NumberAxis() 
    xAxis.label = "Number of Month" 
    val yAxis = new NumberAxis() 

    // Creating the chart 
    val lineChart = LineChart(xAxis,yAxis) 
    //val lineChart: LineChart[NumberAxis, NumberAxis] = _ 

    lineChart.title = "Stock Monitoring, 2010" 

    // defining a series 
    val data = ObservableBuffer(Seq(
     (1, 23), 
     (2, 14), 
     (3, 15), 
     (4, 24), 
     (5, 34), 
     (6, 36), 
     (7, 22), 
     (8, 45), 
     (9, 43), 
     (10, 17), 
     (11, 29), 
     (12, 25) 
    ) map {case (x, y) => XYChart.Data[Number, Number](x, y)}).delegate 

    val series = XYChart.Series[Number,Number]("test",data) 




    lineChart.getData.add(series) 

    val stg = new Stage { 
     title = "Line Chart Sample" 
     scene = new Scene(800, 600) { 
     root = lineChart 
     } 
    } 
    } 

Elle ne parvient pas avec une erreur mettant en évidence sous la ligne de code sur la série

val series = XYChart.Series[Number,Number]("test",data) 


Error:(41, 30) overloaded method value apply with alternatives: 
    (name: String,data: scalafx.collections.ObservableBuffer[javafx.scene.chart.XYChart.Data[Number,Number]])javafx.scene.chart.XYChart.Series[Number,Number] <and> 
    (data: scalafx.collections.ObservableBuffer[javafx.scene.chart.XYChart.Data[Number,Number]])javafx.scene.chart.XYChart.Series[Number,Number] 
cannot be applied to (String, javafx.collections.ObservableList[javafx.scene.chart.XYChart.Data[Number,Number]]) 
    val series = XYChart.Series[Number,Number]("test",data) 

quelqu'un peut me diriger Qu'est-ce qui va pas avec ça? Je suis incapable de comprendre l'erreur correctement.

+0

Le message dit que vous passez un 'ObservableList' à une méthode qui ne peut pas gérer facilement il. Lorsque vous créez la valeur 'data', vous construisez une liste et il est probable qu'elle soit reconvertie en' ObservableBuffer'. –

Répondre

1

Je pense que le problème ici est l'utilisation de la conversion .delegate à la fin de la déclaration ObservableBuffer, qui change data en JavaFXObservableList.

ObservableBuffer (partie de ScalaFX) est déclarée comme étant équivalente à la JavaFXObservableList classe de collection. (Je pense qu'il a été rebaptisé en ScalaFX pour éviter toute confusion avec ce qui constitue un List à Scala.) Il y a une conversion implicite ObservableList-ObservableBuffer, mais ne vous ai pas inclus import scalafx.Includes._ (fortement recommandé) parmi vos importations. Par conséquent, data ne correspond pas au type d'argument attendu de XYChart.Series.apply(String, ObservableBuffer), d'où l'erreur. En omettant l'appel .delegate, vous simplifiez votre code et vous n'avez pas besoin de la conversion implicite. Alternativement, vous pouvez simplement ajouter cette déclaration d'importation à votre code. Toutefois, si vous attendez que votre programme s'exécute, vous devez également affecter le membre stage de JFXApp à un nouveau PrimaryStage. Les travaux suivants:

import scalafx.application.JFXApp 
import scalafx.application.JFXApp.PrimaryStage 
import scalafx.scene.Scene 
import scalafx.scene.chart.{LineChart, NumberAxis, XYChart} 
import scalafx.collections.ObservableBuffer 

object LineChartSample 
extends JFXApp { 

    // Defining the axes 
    val xAxis = new NumberAxis() 
    xAxis.label = "Number of Month" 
    val yAxis = new NumberAxis() 

    // Creating the chart 
    val lineChart = LineChart(xAxis, yAxis) 

    lineChart.title = "Stock Monitoring, 2010" 

    // defining a series 
    val data = ObservableBuffer(Seq(
    (1, 23), 
    (2, 14), 
    (3, 15), 
    (4, 24), 
    (5, 34), 
    (6, 36), 
    (7, 22), 
    (8, 45), 
    (9, 43), 
    (10, 17), 
    (11, 29), 
    (12, 25) 
) map {case (x, y) => XYChart.Data[Number, Number](x, y)}) 

    val series = XYChart.Series[Number, Number]("test", data) 

    lineChart.getData.add(series) 

    stage = new PrimaryStage { 
    title = "Line Chart Sample" 
    scene = new Scene(800, 600) { 
     root = lineChart 
    } 
    } 
}