我想要一个完全自定义窗口外观的应用程序。到目前为止,我了解到我可以使用以下方法删除典型的窗口内容:
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 上的屏幕顶部边缘应该激活最大化等外,其他一切正常。 native 窗口功能完全缺失。
我能否以某种方式更轻松地自定义窗口的整个外观,而不会丢失所有这些不错的功能。
我说的是像 Adobe Photoshop 这样的东西,它看起来完全不同但仍然保留了这些功能(或在其 UI 之上手动实现它们)。
如果我至少可以为初学者实现拖动 + 窗口按钮,那将是一个开始。我这里的目标是 Linux、Mac 和 Windows。
最佳答案
请参阅 Ensemble Sample application 中的自定义窗口外观和处理,其中包括源代码。下载source ,构建它并将其作为独立应用程序运行,而不是嵌入在浏览器中。它不会完全符合您的要求,因为我认为拖动到屏幕顶部边缘以激活最大化之类的东西不会起作用,但它应该非常接近并且您总是可以自己编写一些最大化窗口的代码当它被拖到顶部边缘附近时。 Ensemble 窗口具有自定义调整大小装饰、最小化、最大化、关闭图标、窗口顶部的区域等功能,您可以使用它来拖动窗口或双击以最大化或最小化窗口——即您可以使用的大多数标准功能期望来自桌面窗口系统。
为了更接近您的要求,也许您可以通过创建两个窗口来破解一些东西。一个是包含屏幕边框的标准装饰舞台窗口,另一个是未装饰或透明的子舞台,始终显示在主窗口顶部,并使用自定义渲染覆盖主窗口的边框。我认为您可能会在尝试实现这种方法时遇到困难,所以我真的不推荐它。
您可能想尝试未修饰的舞台风格而不是透明的,看看您是否能更好地与原生 Windows 集成。
目前有一些开放的功能请求计划用于 JavaFX 与 JDK8 一起发布,Windows: support Aero Glass effects for top-level windows , Mac: Support NSTexturedBackgroundWindowMask style for windows和 The solid white background created in a Stage should be created - if needed - in the Scenegraph ,实现后可能会帮助您实现目标 - 如果这些功能对您很重要,请投票给他们。
也结账 VFXWindows这是 JavaFX 的开源窗口框架。
更新
也相关的是 Undecorator该项目允许您使用标准的最小化/最大化/关闭/调整大小 chrome 控件轻松创建 JavaFX 舞台,这些控件通过 JavaFX 引擎而不是操作系统窗口系统呈现。这使您能够实现像 Ensemble 这样的应用程序显示的对窗口渲染的自定义控制。
关于JavaFX 完全定制的窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874664/