Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法访问另一个类中的ScalaFXML控制器类成员_Scala_Scalafx_Scalafxml - Fatal编程技术网

无法访问另一个类中的ScalaFXML控制器类成员

无法访问另一个类中的ScalaFXML控制器类成员,scala,scalafx,scalafxml,Scala,Scalafx,Scalafxml,我有以下代码 @sfxml class Charts(private val predicate_chart:ComboBox[String], private val measure_chart : ComboBox[String], private val chart_chart : ComboBox[String], private val chart_graph : ComboBox[String],

我有以下代码

@sfxml
class Charts(private val predicate_chart:ComboBox[String],
             private val measure_chart : ComboBox[String],
             private val chart_chart : ComboBox[String],
             private val chart_graph : ComboBox[String],
             private val chart_container:Pane) {

       val stackPane = new StackPane()

       def createCharts(): Unit ={    
            new KPie(this).createPie()
       }
}

class KPie(charts:Charts) {
     def createPieUI(result : ResultSet): Unit ={
           val qs: List[QuerySolution] = new IteratorResultSetQuerySolution(result).toList
           val pieChartData = ObservableBuffer(qs.map { v: QuerySolution => PieChart.Data(v.get("s").toString, v.getLiteral("measure").getDouble) })
           val chart = new PieChart(pieChartData)         
           charts.stackPane.getChildren.addAll(chart)
     }
}
当我尝试这一点时,我得到了以下错误

Error: value stackPane is not a member of Charts
    charts.stackPane.getChildren.addAll(chart)

我只想在另一个类中使用控制器类变量。请提前帮助我访问这些成员变量,谢谢。

我无法测试这是否解决了您的问题,但ScalaFXML表明@sfxml宏将用生成的版本替换控制器类,从而有效地删除用户提供的类成员。看起来这就是你问题的原因

文档描述了一种通过将其他类成员放置在trait或抽象类(可能是控制器类的扩展类)中来提供这些成员的方法。要访问这些成员,首先需要通过调用getController[Trait]获取对控制器的引用,其中Trait是FXMLLoader实例上Trait的名称。按照这种方法,您的代码将如下所示:

特征图表成员{ //注意:此堆栈窗格显然不在任何地方使用。 val stackPane=新的stackPane //注意:我添加了示例所需的ResultSet参数。 def createChartsresult:ResultSet:Unit={ //注意:在您的示例中没有KPie的createPie成员 //createPieUIResultSet函数是最初的预期调用。下面是我所做的: //1.将createPie重命名为createPieUI。 //2.添加ChartsMembers引用,以便此特征的成员可用。 // //注意:对KPie实例的引用既没有存储也没有返回,因此也不会返回 //由于它的charts参数现在是多余的,所以我将KPie改为 //成为一个物体。 KPie.createpieuit这个,结果 } } //注意:图表现在扩展了ChartsMembers。 // //注意:我已经删除了参数的私有val声明,因为它们是 //多余的。 @sfxml 班级图表 谓词图表:组合框[字符串], 度量值图表:组合框[字符串], 图表\图表:组合框[字符串], 图表\图形:组合框[字符串], 图表容器:窗格 扩展图表成员 //注意:这现在是一个对象-请参见上面的注释。 对象KPI{ //注:更改的签名-见上述注释。 def createPieUIcontroller:ChartsMembers,结果:结果集:单位={ val qs:List[QuerySolution]=新的迭代器ResultSetQuerySolutionResult.toList val pieChartData=observebufferqs.map{v:QuerySolution=> PieChart.Datav.gets.toString,v.getLiteralmeasure.getDouble } val chart=新的PieChartpieChartData //访问控制器上的stackPane成员。 controller.stackPane.getChildren.addAllchart } } 为了使用上述内容,您首先需要获取在任何情况下都需要的加载程序引用,然后使用该引用调用createCharts函数:

val result=//根据需要。。。 val loader=根据需要新建FXMLLoader/*参数*/ val controller=loader.getReference[ChartsMembers] //在控制器上创建图表。 controller.createChartsresult 老实说,这一切看起来相当复杂,并且生成的填充堆栈窗格没有被任何东西使用或添加到场景图中,因此上面的内容都是毫无意义的。但是,我希望您能够了解这种方法的工作原理,以便在应用程序中实现它


一个包含所有源文件和构建文件的应用程序将非常有帮助

从表面上看,这确实很奇怪。然而,很难从这个小片段中找出原因。请更新您的问题,以提供一个新的答案?