在ScalaFX中将SubScene添加到BorderPane的中心

时间:2014-12-05 16:38:25

标签: scala javafx javafx-8 scalafx

我的ScalaFX 8应用程序的主要布局包含BorderPanetop属性包含一个菜单,而bottom包含类似于状态栏的内容。我的目标是显示一个组件,用于在BorderPane的center中查看3D对象(充当SubScene)。

stage = new PrimaryStage {
  scene = new Scene(900, 900, true, SceneAntialiasing.Balanced) {
    root = new BorderPane {
      top = createMenu // creates a menu inside of a VBox
      center = createViewer // should create a subscene inside of whatever is needed
      bottom = createStatusBar // creates a status bar inside of a VBox
    }
  }
}

我正在尝试使用SubScene创建一个最小的工作示例,该示例仅包含黑色背景和简单的球体,不多也不少。 SubScene应该使用BorderPane中心可用的整个空间并相应地调整大小。不幸的是,我无法使其发挥作用。

由于SubScene的大小是固定的,我认为有必要将SubScene嵌入另一个容器(能够自动调整大小)并将SubScene的尺寸绑定到它周围的容器的尺寸。

def createViewer = {
  val bp = new BorderPane
  val subScene: SubScene = new SubScene(bp, 200, 200, true, SceneAntialiasing.Balanced) {
    fill = Color.Black
    width <== bp.width
    height <== bp.height
    content = new Sphere(3) { material = new PhongMaterial(Color.Red) }
    camera = new PerspectiveCamera(true) { ... }
  }
  bp.center = subScene
  subScene
}

结果如下:

enter image description here

两个明显的问题:

  • SubScene保持其构造函数的固定大小。在外部BorderPane的中心既没有“最大化”,也没有在窗口调整大小时做任何事情
  • 有红点,但SubScene的右下角不是黑色(?)

我的假设是我在理解SubScene的根元素是什么以及它的作用方面存在一些问题。我发现another thread for JavaFX with a similar problem,这个解决方案区分了SubScene的根元素(我不确定该元素来自哪里)和Pane,但我不能将它应用于我的情况。任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

这里的想法是获取顶级场景的只读属性,这可能是一种更优雅的方式来做到这一点,但这是有效的

scene = new Scene(900, 900, true, SceneAntialiasing.Balanced) {
   // these are read only properties for the scene
   var tmpw = this. width
   var tmph =  this. height

   root = new BorderPane {

     top = new HBox {
       content = new Label {
         text = "menu"
       }
     }

     center = createView(tmpw,  tmph)

   }
 }
   width onChange show
   height onChange show

}

这里的想法是将只读属性绑定到子场景的属性,然后 subcene将重新调整大小,可能有一种方法可以避免'this'关键字。 我已经测试了这个以及子场景与父场景一起重新调整大小。我已经省略了PerspectiveCamera代码块,因为你没有包含你正在使用的东西

def createView(boundWidth : ReadOnlyDoubleProperty, boundHeight : ReadOnlyDoubleProperty):         BorderPane = {

  new BorderPane {

      center = new SubScene(boundWidth.get(), boundHeight.get(), true, SceneAntialiasing.Balanced) {
      fill = Color.BLACK
      content = new Sphere(3) { material = new PhongMaterial(Color.RED) }
      camera = new PerspectiveCamera(true)
       // bind the subscene properties to the parents 
        this.width.bind(boundWidth.add(-200))
        this.height.bind(boundHeight.add(-200))
    }

  }

}