JavaFX完全自定义windows?

Tow*_*wer 17 java scala javafx javafx-2

我想有一个应用程序,我完全自定义窗口的外观.到目前为止,我已经了解到我可以删除典型的窗口内容:

class Application extends javafx.application.Application {
  /**
   * Starts the application.
   *
   * @param stage
   */
  override def start(stage: Stage) {
    stage.initStyle(StageStyle.TRANSPARENT)

    // Load the main window view.
    val loader = new FXMLLoader()
    loader.setLocation(getClass.getResource("/com/myproj/application/MainWindow.fxml"))

    val root = loader.load().asInstanceOf[Parent]
    val scene: Scene = new Scene(root, Color.TRANSPARENT)

    stage.setScene(scene)
    stage.show()
  }
}
Run Code Online (Sandbox Code Playgroud)

其他一切工作正常,除了窗口拖动,双击 - 最大化,在Windows上拖动到屏幕顶边应该激活最大化等等.本机窗口功能完全缺失.

我可以在某种程度上轻松地自定义窗口的整个显示而不会丢失所有这些不错的功能.

我说的是类似Adobe Photoshop的东西,看起来完全不同但仍保留这些功能(或手动在UI上实现它们).

如果我至少可以为初学者实现拖动+窗口按钮,那将是一个开始.我在这里瞄准Linux,Mac和Windows.

jew*_*sea 15

请参阅Ensemble示例应用程序中的自定义窗口外观和处理,其中包括源代码.下载源代码,构建它并将其作为独立应用程序运行,而不是嵌入到浏览器中.它不会完全是你要求的东西,因为拖动到屏幕上边缘以激活最大化的东西不会起作用我想,但它应该非常接近你总是可以自己编写一些东西来最大化窗口当它被拖到顶边附近时.Ensemble窗口具有自定义调整大小装饰,最小化,最大化,关闭图标,窗口顶部可用于拖动窗口或双击以最大化或最小化窗口的区域等功能 - 即大多数标准功能期望从桌面窗口系统.

为了得到更接近你要求的东西,也许你可以通过创建两个窗口来共同破解一些东西.一个是标准装饰的舞台窗口,包括屏​​幕边框,另一个是未装饰或透明的子舞台,总是显示在主窗口的顶部,并用自定义渲染覆盖主窗口的边框.我认为你可能会遇到试图实施这种方法的困难,所以我不会真的推荐它.

您可能希望尝试UNDECORATED舞台样式而不是TRANSPARENT,看看您是否可以获得更好的本机Windows集成.

目前有一些开放的功能请求计划用于JDF8,Windows附带的JavaFX :支持顶级窗口的Aero Glass效果,Mac:支持Windows的NSTexturedBackgroundWindowMask样式,并且应创建在舞台中创建的纯白色背景 - 如果需要- 在场景图中,实施后,可能会帮助您实现目标 - 如果这些功能对您很重要,请投票给他们.

合奏样本申请

还要检查VFXWindows,它是JavaFX的开源窗口框架.

更新

另外还有Undecorator项目,它允许您轻松创建一个JavaFX阶段,其中包含通过JavaFX引擎而不是OS窗口系统呈现的标准最小化/最大化/关闭/调整大小的chrome控件.这允许您实现对Ensemble等应用程序显示的窗口渲染的自定义控制.