1
package pGrid
package pUIFx
import pUtil._    

object DevAppFx extends AppFx
{
  println("Begining DevFxApp object constructor in package pGrid.pUIFx")   
  //devStart 
}

package pGrid
package pUIFx
import pGeom._
import pGrid.pDev._

import scalafx.application._
import scalafx.application.JFXApp._
import scalafx.scene._
import scalafx.scene.paint._

class AppFx extends JFXApp with DevTr
{   
  println("Creating stage")
  stage =  new PrimaryStage
  {
    x = 3850
    y = 200
    width = 1000
    height = 800          
    scene = new Scene
  }
  def openEFO(de: DescEFlatOne): Unit =
  {
    println("def in AppFx")
    stage.scene = ScrEditFx(stage, de)            
  }
}

DevAppFx 对象构造函数运行,包括 println ("Beginning ...

类 AppFx 构造函数不运行,包括 println(“创建阶段”)。可以调用 openEFO 方法,但阶段变量为空。

编辑这是一个简化。DEVAppFx 和 AppFx 中将有更多的功能,因此能够将功能分开很重要。

4

2 回答 2

3

我认为这里的问题是这scalafx.application.JXFApp是一个扩展scala.DelayedInit特征的类。因此,一些Scala 魔法发生在幕后:有关更多信息,请参阅scala.DelayedInit文档。不幸的是,DelayedInit这是错误的并且对子类初始化/构造代码造成严重破坏 - 例如您的AppFx类没有执行其构造函数。

恐怕没有简单的解决方案。在DelayedInit行为得到解决之前,或者在我们找到更好的初始化方法之前ScalaFX,最好的办法是合并DevAppFxAppFx一个对象中,这应该可以按预期工作。

例如:

package pGrid
package pUIFx
import pGeom._
import pGrid.pDev._

import scalafx.application._
import scalafx.application.JFXApp._
import scalafx.scene._
import scalafx.scene.paint._

object AppFx extends JFXApp with DevTr
{   
  println("Creating stage")
  stage =  new PrimaryStage
  {
    x = 3850
    y = 200
    width = 1000
    height = 800          
    scene = new Scene
  }
  // Relocate DevAppFx init here...
  println("Begining DevFxApp object constructor in package pGrid.pUIFx")   
  //devStart 
  def openEFO(de: DescEFlatOne): Unit =
  {
    println("def in AppFx")
    stage.scene = ScrEditFx(stage, de)            
  }
}

更新

我做了更多的挖掘工作,并scalafx.application.JFXApp没有很好地实现scala.DelayedInit特征的语义。本质上,它只是将类/对象的构造/初始化代码存储在继承层次结构的底部,而丢弃其他所有内容。有关更多详细信息,请参阅此问题的 ScalaFX 错误报告

因此,在您的示例中,对象DevAppFx的构造代码正在替换您的类的构造代码AppFx,而不是存储两者,从而导致您观察到的症状。

我已经在 Google Code 上为 ScalaFXdefault的分支和SFX-8分支提交了一个补丁,您可以免费使用它。或者,如果您准备等待几周,发布到 Sonatype OSS 以获取补丁的下一个更新将是 1.0.0-R9(对于 JavaFX 2 等效版本)和 8.0.0-R5(对于 JavaFX 8相等的)。

此补丁应该允许您的原始代码在未经修改的情况下运行。如果您有机会尝试一下,请告诉我您的进展情况...

于 2014-03-18T23:11:11.257 回答
0

我使用了 Mike Allen 的回答中有关 DelayedInit 中可能存在的错误的信息。但是,我想将功能分开而不是将其组合到一个对象中。阅读文档,问题在于类和对象不具有从 JFXApp 和 DelayedInit 继承的特征,因此我已将 AppFx 转换为特征并将舞台创建移动到方法中

object DevAppFx extends AppFx with DevTr
{
  openStage
  devStart 
}

__ _ __ _ __ _ __ _ --

trait AppFx extends JFXApp with StratApp
{
  def openStage: Unit = stage =  new PrimaryStage
  {
    x = 3850
    y = 200
    width = 1000
    height = 800          
    scene = new Scene
  }
  override def openEFO(de: DescEFlatOne): Unit = stage.scene = ScrEditFx(this, de)   
}
于 2014-03-19T02:42:49.080 回答