JavaFX完全自定义windows?

时间:2012-10-13 15:43:40

标签: java scala javafx-2 javafx

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

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为目标。

2 个答案:

答案 0 :(得分:15)

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

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

您可能希望尝试使用UNDECORATED舞台风格而不是TRANSPARENT,看看您是否能够更好地使用本机Windows集成。

目前为JavaFX安排了一些开放功能请求,这些请求随JDK8 Windows: support Aero Glass effects for top-level windowsMac: Support NSTexturedBackgroundWindowMask style for windowsThe solid white background created in a Stage should be created - if needed - in the Scenegraph一起提供,一旦实施,可能会帮助您实现目标 - 如果这些功能对您很重要,请投票给他们。

Ensemble Sample Application

同时checkout VFXWindows这是JavaFX的开源窗口框架。

更新

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

答案 1 :(得分:0)

您可以使用this库。它是一个完全可定制的JavaFx Stage(CustomStage)。您可以在此CustomStage Wiki

中查看有关如何使用它的详细说明

它有,

  • 调整窗口大小
  • 默认操作按钮及其行为(关闭,最大化/恢复,最小化)
  • 窗口拖动
  • 窗口会根据屏幕分辨率自动缩放
  • 非常敏感
  • Stylable(通过css和方法)
  • 可以实现透明度
  • 内置导航窗格和抽屉