2015-09-17 43 views
0

这里爬上一个饼图是代码:钻孔向下和在scalafx

package scalafx.ensemble.example.charts 

import javafx.scene.chart.PieChart.Data 

import scala.util.Random 
import scalafx.application.JFXApp 
import scalafx.scene.Scene 
import scalafx.Includes._ 
import scalafx.collections.ObservableBuffer 
import scalafx.scene.chart.PieChart 
import scalafx.scene.input.MouseEvent 
import scala.collection.mutable.{HashMap => MMap} 

object BasicPie extends JFXApp { 

    stage = new JFXApp.PrimaryStage { 
    title = "Drilldown Pie Chart Example" 
    scene = new Scene { 
     root = { 
     val pieChartDataBuffer = ObservableBuffer(
      PieChart.Data("A", 20), 
      PieChart.Data("B", 30), 
      PieChart.Data("C", 10), 
      PieChart.Data("D", 40) 
     ) 
     val pieChart = new PieChart { 
      data = pieChartDataBuffer 
      title = "DrillDown Pie Chart" 
     } 

     def subPieChartData: MMap[String, ObservableBuffer[Data]] = { 
      val subDataMap: MMap[String, ObservableBuffer[Data]] = MMap.empty 
      for(letter <- Array("A", "B", "C", "D")) { 
      val dataBuffer: ObservableBuffer[Data] = ObservableBuffer.empty 
      for(i <- 1 to 10) { 
       val subLabel = letter + i 
       dataBuffer.add(PieChart.Data(subLabel, Random.nextInt(100))) 
      } 
      subDataMap.update(letter, dataBuffer) 
      } 
      subDataMap 
     } 

     def drillDownData = (pie: PieChart, pieData: PieChart.Data) => { 
      val labelPrefix = pieData.name() 
      val subData = subPieChartData(pieData.name()) 
      pieData.node().onMouseClicked = (_: MouseEvent) => pie.data = subData 
      subData.foreach(
      (data) => climbUpData(pie, data) 
     ) 
     } 

     def climbUpData = (pie: PieChart, pieData: PieChart.Data) => { 
      val node = pieData.node() 
      if(node != null) { 
      node.onMouseClicked = (_: MouseEvent) => pie.data = pieChartDataBuffer 
      } 
     } 

     pieChartDataBuffer.foreach((data: Data) => drillDownData(pieChart, data)) 

     pieChart 
     } 
    } 
    } 

} 

预期行为:

  1. 当应用程序运行时,它应显示主组的饼图。 (好)

  2. 当您点击饼图的任何一个切片时,您应该会看到该主要组的次要组的饼图。 (好)

  3. 当您在辅助组的圆形图中单击任何切片时,应该将其带回主要的圆形图。 (不工作)

它编译和运行没有问题,下钻也按预期工作,但爬升不是。为什么?

回答

0

我应该先设置鼠标点击监听器之前设置二级饼图数据到PieChart对象:

package scalafx.ensemble.example.charts 

import javafx.scene.chart.PieChart.Data 

import scala.util.Random 
import scalafx.application.JFXApp 
import scalafx.scene.Scene 
import scalafx.Includes._ 
import scalafx.collections.ObservableBuffer 
import scalafx.scene.chart.PieChart 
import scalafx.scene.input.MouseEvent 
import scala.collection.mutable.{HashMap => MMap} 

object BasicPie extends JFXApp { 

    stage = new JFXApp.PrimaryStage { 
    title = "Drilldown Pie Chart Example" 
    scene = new Scene { 
     root = { 
     val pieChartDataBuffer = ObservableBuffer(
      PieChart.Data("A", 20), 
      PieChart.Data("B", 30), 
      PieChart.Data("C", 10), 
      PieChart.Data("D", 40) 
     ) 
     val pieChart = new PieChart { 
      data = pieChartDataBuffer 
      title = "DrillDown Pie Chart" 
     } 

     def subPieChartData: MMap[String, ObservableBuffer[Data]] = { 
      val subDataMap: MMap[String, ObservableBuffer[Data]] = MMap.empty 
      for (letter <- Array("A", "B", "C", "D")) { 
      val dataBuffer: ObservableBuffer[Data] = ObservableBuffer.empty 
      for (i <- 1 to 10) { 
       val subLabel = letter + i 
       dataBuffer.add(PieChart.Data(subLabel, Random.nextInt(100))) 
      } 
      subDataMap.update(letter, dataBuffer) 
      } 
      subDataMap 
     } 

     def drillDownData = (pie: PieChart, pieData: PieChart.Data) => { 
      val labelPrefix = pieData.name() 
      val subData = subPieChartData(pieData.name()) 
      pieData.node().onMouseClicked = { 
      (_: MouseEvent) => { 
       pie.data = subData 
       subData.foreach(
       (data) => climbUpData(pie, data) 
      ) 
      } 
      } 
     } 

     def climbUpData = (pie: PieChart, pieData: PieChart.Data) => { 
      val node = pieData.node() 
      if (node != null) { 
      node.onMouseClicked = (_: MouseEvent) => pie.data = pieChartDataBuffer 
      } 
     } 

     pieChartDataBuffer.foreach((data: Data) => drillDownData(pieChart, data)) 

     pieChart 
     } 
    } 
    } 

} 

object Test { 
    BasicPie.main(Array("a")) 
}