0

I am working on a sample of line chart code:

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

It is failing with error highlighting BELOW line of code on Series

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)

Can someone point me what is wrong with it? I am unable to understand the error properly.

user unknown
  • 35,537
  • 11
  • 75
  • 121
  • The message is saying you are passing an `ObservableList` to a method that cannot readily handle it. When you create the `data` value, you are constructing a list, and it likely should be converted back to an `ObservableBuffer`. – Bob Dalgleish Oct 18 '17 at 21:57

1 Answers1

1

I think the problem here is the use of the .delegate conversion at the end of the ObservableBuffer declaration, which changes data into a JavaFX ObservableList.

ObservableBuffer (part of ScalaFX) is declared to be equivalent to the JavaFX ObservableList collection class. (I think it was renamed in ScalaFX to avoid confusion with what constitutes a List in Scala.) There is an implicit conversion from ObservableList to ObservableBuffer, but you have not included import scalafx.Includes._ (highly recommended) among your imports. As a result, data doesn't match the expected argument type of XYChart.Series.apply(String, ObservableBuffer), hence the error. By omitting the .delegate call, you simplify your code and do not require the implicit conversion. Alternatively, you could just add that import statement to your code.

However, if you expect your program to run, you should also assign the stage member of JFXApp to a new PrimaryStage. The following works:

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
    }
  }
}
Mike Allen
  • 8,139
  • 2
  • 24
  • 46