JavaFX完全定制的窗口?

2022-09-02 22:06:36

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

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()
  }
}

其他一切正常,除了窗口拖动,双击最大化,拖动到Windows上的屏幕顶部边缘应该活动最大化等。本机窗口功能完全缺失。

我可以以某种方式轻松自定义窗口的整个外观,而不会丢失所有这些不错的功能。

我说的是像Adobe Photoshop这样的东西,它看起来完全不同,但仍然保留了这些功能(或者手动在UI之上实现它们)。

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


答案 1

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

为了让某些东西更接近你所问的东西,也许你可以通过创建两个窗口来破解一些东西。一个是标准的装饰舞台窗口,包括屏幕边框,另一个是未装饰或透明的子舞台,始终显示在主窗口的顶部,并使用自定义渲染覆盖主窗口的边框。我认为在尝试实现此方法时可能会遇到困难,因此我并不真正推荐它。

您可能想尝试一种未装饰的舞台风格,而不是透明,看看您是否获得了更好的本机Windows集成。

目前有一些开放功能请求,JavaFX将与JDK8一起提供,Windows:支持顶级窗口的Aero Glass效果Mac:支持Windows的NSTexturedBackgroundWindowMask样式如果需要,应该在Scenegraph中创建在舞台上创建的纯白色背景,当实现时,可能会帮助您实现目标 - 为他们投票, 如果这些功能对您很重要。

Ensemble Sample Application

还可以查看VFXWindows,这是JavaFX的开源窗口框架。

更新

与此相关的还有Undecorator项目,它允许您使用通过JavaFX引擎而不是操作系统窗口系统呈现的标准最小化/最大化/关闭/调整大小的chrome控件轻松创建JavaFX阶段。这允许您实现像 Ensemble 这样的应用程序显示的对窗口呈现的自定义控制。


答案 2

您可以使用库。它是一个完全可定制的JavaFx Stage(CustomStage)。您可以在此自定义关卡 Wiki 中查看有关如何使用它的详细说明

它具有,

  • 调整窗口大小
  • 默认操作按钮及其行为(关闭、最大化/还原、最小化)
  • 窗口拖动
  • 窗口自动缩放为屏幕分辨率
  • 反应非常迅速
  • 可样式化(通过css和方法)
  • 可实现透明度
  • 具有内置导航窗格和抽屉
  • 等。

推荐