首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Swing 半透明視窗實作:AWTUtilities 與 JDK 7+ 標準 API 對比

     編輯:Java 程式設計入門

舊版做法(JDK 6u10+,內部 API)

import com.sun.awt.AWTUtilities;
public class TranslucentFrame extends JFrame {
    public TranslucentFrame() {
        AWTUtilities.setWindowOpacity(this, 0.6f); // 0.0~1.0
        setTitle("半透明視窗");
        setSize(400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) { new TranslucentFrame(); }
}

缺點: com.sun.* 非標準,JDK 9+ 模組化後默認不可訪問,需 --add-opens。

標準做法(JDK 7+)

public class TranslucentFrame extends JFrame {
    public TranslucentFrame() {
        // 必須在 setVisible 前設置,且需底層視窗系統支援
        setBackground(new Color(0, 0, 0, 0)); // 透明背景
        setUndecorated(true); // 去除標題欄/邊框(可選)

        // 整體不透明度
        setOpacity(0.6f); 

        setTitle("標準半透明視窗");
        setSize(400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}

進階:非矩形/漸變透明視窗


// 形狀:圓角矩形
setShape(new RoundRectangle2D.Double(0, 0, 400, 300, 30, 30));

// 漸變透明:需重寫 paintComponent
JPanel panel = new JPanel() {
    @Override protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setPaint(new GradientPaint(0, 0, new Color(0,0,0,0.8f), 
                                      0, 300, new Color(0,0,0,0f)));
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.dispose();
    }
};
panel.setOpaque(false);
setContentPane(panel);

支援度檢測

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
boolean translucent = gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT);
boolean perPixel = gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT);
System.out.println("整體透明: " + translucent + ", 像素級: " + perPixel);

注意事項

問題解決
Linux 無合成器需啟用 Compton/Picom 或 KWin/ Mutter
Windows 遠程桌面透明度可能失效,檢測 perPixel 為 false 時降級
setUndecorated(true)必須在 setVisible(true) 前調用
重繪閃爍開啟雙緩衝 RepaintManager.setDoubleBufferingEnabled(true)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved