2

我的 ScalaFX 8 应用程序的主要布局包括一个BorderPane. 该top属性包含一个菜单,而bottom包含类似于状态栏的东西。我的目标是在 BorderPane 中显示一个用于查看 3D 对象的组件center(充当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
}

结果如下所示:

在此处输入图像描述

两个明显的问题:

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

我的假设是我在理解 SubScene 的根元素到底是什么以及它的作用方面存在一些问题。我为 JavaFX 找到了另一个有类似问题的线程,该解决方案区分了 SubScene 的根元素(我不确定该元素来自何处)和窗格,但我无法将其应用于我的案例。任何帮助表示赞赏。谢谢。

4

1 回答 1

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

}

这里的想法是将只读属性绑定到子场景的属性,然后子场景将重新调整大小,可能有一种方法可以避免使用“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))
    }

  }

}
于 2014-12-10T00:19:21.750 回答