2017-10-18 58 views
0

我上线图码样本共创线型图:Scalafx:在斯卡拉

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 
     } 
    } 
    } 

它与错误突出低于代码行系列失败

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) 

有人能指出我它有什么问题?我无法正确理解错误。

+0

该消息是说你正在传递一个'ObservableList'到一个不容易处理它的方法。当你创建'data'值时,你正在构造一个列表,它可能应该被转换回'ObservableBuffer'。 –

回答

1

我觉得这里的问题是在ObservableBuffer声明,从而改变data的JavaFXObservableList结束使用.delegate转换。

ObservableBufferScalaFX的一部分)是被宣布为等同于JavaFX的ObservableList集合类。 (我认为这是在ScalaFX改名,以避免与什么是在斯卡拉List混乱)有从ObservableListObservableBuffer的隐式转换,但是你有没有包含在您的进口中import scalafx.Includes._(强烈推荐)。因此,data与预期的参数类型XYChart.Series.apply(String, ObservableBuffer)不匹配,因此是错误。通过省略.delegate调用,可以简化代码并且不需要隐式转换。或者,您可以将该import语句添加到您的代码中。

但是,如果您希望程序运行,您还应该将stageJFXApp的成员分配给新的PrimaryStage。下面的工作:

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 
    } 
    } 
}