18

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

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 上的屏幕顶部边缘应该激活最大化等。本机 Window 功能完全缺失。

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

我说的是 Adob​​e Photoshop 之类的东西,它看起来完全不同,但仍保留了这些功能(或在其 UI 之上手动实现它们)。

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

4

2 回答 2

16

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

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

您可能想尝试使用 UNDECORATED 舞台风格而不是 TRANSPARENT,看看是否能获得更好的原生 Windows 集成。

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

合奏示例应用程序

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

更新

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

于 2012-10-13T17:15:51.893 回答
0

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

它有,

  • 窗口大小调整
  • 默认操作按钮及其行为(关闭、最大化/恢复、最小化)
  • 窗口拖动
  • 窗口根据屏幕分辨率自动缩放
  • 反应灵敏
  • 可样式化(通过 css 和方法)
  • 可以实现透明
  • 具有内置导航窗格和抽屉
  • 等等
于 2018-04-18T11:04:36.503 回答