如何去除JavaFX中StageStyle.UTILITY标题栏或隐藏UNDECORATED任务栏图标
解决JavaFX无标题栏且不在任务栏显示的窗口问题
我之前做JavaFX覆盖层的时候也碰到过一模一样的问题!刚好有两个稳定的解决方案,帮你实现无标题栏+不在任务栏显示的窗口需求:
方法一:用隐藏的UTILITY窗口做owner,搭配UNDECORATED窗口
这是最靠谱的方案,完美匹配你的需求:
- 先创建一个完全透明的
StageStyle.UTILITY样式窗口(它本身不会在任务栏显示,也不会被用户看到) - 把我们需要的无标题栏窗口(
StageStyle.UNDECORATED样式)的owner设置为这个隐藏窗口 - 因为有了有效的owner,
UNDECORATED窗口就不会在任务栏显示了
直接上代码示例:
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import javafx.stage.StageStyle; public class OverlayDemo extends Application { @Override public void start(Stage primaryStage) { // 第一步:创建隐藏的UTILITY父窗口 Stage hiddenOwnerStage = new Stage(StageStyle.UTILITY); hiddenOwnerStage.setOpacity(0); // 设为完全透明,避免显示 hiddenOwnerStage.show(); // 必须调用show,否则owner关系不生效 // 第二步:创建我们的无标题栏覆盖层窗口 Stage overlayStage = new Stage(StageStyle.UNDECORATED); overlayStage.initOwner(hiddenOwnerStage); // 绑定到隐藏的父窗口 overlayStage.setScene(new Scene(new AnchorPane(), 400, 300)); // 可选:给窗口添加拖拽功能(无标题栏默认不能拖拽) addDragSupport(overlayStage); overlayStage.show(); } // 实现窗口拖拽的辅助方法 private void addDragSupport(Stage stage) { double[] dragOffset = new double[2]; stage.getScene().setOnMousePressed(event -> { dragOffset[0] = stage.getX() - event.getScreenX(); dragOffset[1] = stage.getY() - event.getScreenY(); }); stage.getScene().setOnMouseDragged(event -> { stage.setX(event.getScreenX() + dragOffset[0]); stage.setY(event.getScreenY() + dragOffset[1]); }); } public static void main(String[] args) { launch(args); } }
为什么你之前的所有权设置没生效?
你之前尝试的方案没成功,大概率是因为owner窗口没有被show()出来——JavaFX要求owner窗口必须处于显示状态,系统才会识别这个层级关系,进而隐藏子窗口的任务栏图标。
关于直接修改UTILITY样式去掉标题栏
说实话,StageStyle.UTILITY的标题栏是系统原生组件,JavaFX并没有提供直接移除它的API。如果强行用JNI或者其他 hack 方式修改,很容易出现跨平台兼容性问题,所以上面的方案是更稳妥的选择。
内容的提问来源于stack exchange,提问作者AnacondaDoe
相关产品推荐
相关产品推荐

