You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ScalaFX的单个场景中创建两个窗口?

ScalaFX单Scene实现双窗口的方案说明

首先明确核心限制:ScalaFX 底层基于 JavaFX 实现,顶级窗口(Stage)是和操作系统原生窗口绑定的独立容器,不属于场景图(Scene Graph)的Node节点类型,无法直接嵌入单个Scene内部,ScalaFX也没有提供可以直接塞进Scene的专用嵌入式窗口API,但可以通过以下三类原生支持的方案实现同等效果:

  • 固定/可调整比例的并排双区域:使用SplitPane组件
    适合两个窗口需要同时展示、支持用户拖拽调整两个区域占比的场景,是最简单的实现方式,示例代码如下:

    import scalafx.Includes._
    import scalafx.application.JFXApp3
    import scalafx.scene.Scene
    import scalafx.scene.control.Label
    import scalafx.scene.control.SplitPane
    import scalafx.scene.layout.StackPane
    
    object DualPaneDemo extends JFXApp3 {
      override def start(): Unit = {
        stage = new JFXApp3.PrimaryStage {
          title = "单Scene双窗口示例"
          scene = new Scene(800, 500) {
            root = new SplitPane {
              // 第一个内容区域
              val firstPane = new StackPane {
                children = new Label("第一个窗口内容区")
              }
              // 第二个内容区域
              val secondPane = new StackPane {
                children = new Label("第二个窗口内容区")
              }
              items.addAll(firstPane, secondPane)
              // 初始分隔位置在场景宽度50%处
              dividerPositions = 0.5
            }
          }
        }
      }
    }
    
  • 标签切换式双窗口:使用TabPane组件
    适合两个窗口不需要同时展示、通过标签点击切换视图的场景,每个Tab对应一个独立的内容窗口,互相不干扰。

  • 悬浮可拖拽的子窗口效果:自定义面板实现MDI效果
    如果需要类似传统多文档界面的悬浮、可拖拽、可关闭的子窗口效果,可以将Scene的根节点设为普通面板(比如Pane、AnchorPane),把自定义的带标题栏、拖拽逻辑的面板作为子节点添加到根面板上即可,本质是将子窗口作为普通场景节点渲染,不需要依赖顶级Stage。

注意:不要尝试将Stage实例添加到Scene的节点树中,Stage属于Window类型而非Node子类,强行添加会抛出类型不匹配的运行时错误。

内容的提问来源于stack exchange,提问作者Yeasmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:48:20