如何为使用JTattoo外观的JFrame设置无装饰模式?
解决JTattoo主题下JFrame无装饰模式不生效的问题
我之前也踩过这个坑!JTattoo主题自带了一套窗口装饰逻辑,直接调用setUndecorated(true)经常会被主题覆盖,导致设置不生效。下面是亲测有效的两种解决方式:
方法一:初始化主题前禁用窗口装饰支持
在加载JTattoo主题之前,先通过系统属性关闭它的窗口装饰功能,这样后续设置JFrame无装饰就能正常生效了:
// 第一步:禁用JTattoo的窗口装饰支持 System.setProperty("jtattoo.useWindowDecorations", "false"); // 第二步:加载你需要的JTattoo主题(这里以Acryl为例) try { UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel"); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } // 第三步:创建并设置无装饰窗口 JFrame frame = new JFrame("JTattoo无装饰窗口"); frame.setUndecorated(true); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);
方法二:动态修改已加载主题的配置
如果已经加载了JTattoo主题,也可以通过UIManager动态关闭窗口装饰,再更新窗口UI让设置生效:
// 先加载主题(示例) try { UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); } catch (Exception e) { e.printStackTrace(); } // 创建窗口后,动态关闭JTattoo的窗口装饰 JFrame frame = new JFrame("动态设置无装饰"); UIManager.put("JFrame.useWindowDecorations", Boolean.FALSE); frame.setUndecorated(true); // 强制更新UI,确保设置生效 frame.updateUI(); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);
关键原因说明
JTattoo主题默认会启用自定义窗口装饰,这个优先级高于JFrame自身的undecorated属性。所以必须先让主题放弃对窗口装饰的控制,再设置setUndecorated(true)才能达到预期效果。
内容的提问来源于stack exchange,提问作者Udeesha Induwara
相关产品推荐
相关产品推荐

