Java Swing 中无边框窗口的抗锯齿圆角化方案
问题背景 最近在写 LiveDock 时,我需要实现一个无边框 + 圆角 + 可拖动的 Swing 窗口。 接触 FlatLaf 之后,我一开始还是很乐观的,我以为用 JFrame.setUndecorated(true) 配合 setShape(new RoundRectangle2D...)就能完美实现我想要的效果。 结果却让我大失所望: 这是什么鬼?告诉你坝这圆角圆在哪? 初步尝试抗锯齿 这是上面提到的初始代码: frame.setUndecorated(true); frame.setBackground(new Color(0, 0, 0, 0)); frame.setShape(new RoundRectangle2D.Double(0, 0, w, h, arc, arc)); 尝试求助了ChatGPT,他贴心地给我提供了一个 Graphics2D 的抗锯齿方案: 一个放入了 fillRoundRect() 的自定义 JPanel: protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); g2.setColor(Color.DARK_GRAY); g2.fillRoundRect(0, 0, getWidth(), getHeight(), arc, arc); g2.dispose(); } 正常情况下,这段代码应该能得到一个光滑的圆角窗口,但经过我的尝试,它的效果和上面展示的图片并没有什么区别…… 那问题出在哪里呢? 来自 setShape() 的坑 先说结论: setShape() 是一个 AWT 级别的窗口裁切方法,它会把窗口的形状裁切成指定的形状,并且会把所有的绘制内容都限制在这个形状内。...