You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java NetBeans 8.2中实现穿透鼠标的置顶水印窗口?

实现全屏穿透式水印窗口(Java NetBeans 8.2)

核心实现思路

要完成需求,需让窗口同时具备以下特性:

  • 全屏覆盖屏幕,无标题栏、边框等装饰
  • 始终置顶显示
  • 半透明效果,仅作为水印存在
  • 鼠标事件完全穿透,底层窗口可正常接收操作

具体实现步骤

1. 创建NetBeans项目

打开NetBeans 8.2,创建Java Application项目,勾选"Create Main Class"选项。

2. 编写窗口核心代码

替换自动生成的主类代码为以下内容:

import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class WatermarkWindow extends JFrame {

    public WatermarkWindow() {
        // 移除窗口装饰(标题栏、边框)
        setUndecorated(true);
        
        // 获取屏幕最大尺寸,设置窗口全屏
        Rectangle screenBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
        setSize(screenBounds.width, screenBounds.height);
        
        // 设置窗口始终置顶
        setAlwaysOnTop(true);
        
        // 配置窗口透明度与鼠标穿透
        try {
            // 设置半透明(0.0完全透明,1.0完全不透明,此处0.3为水印常用透明度)
            com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.3f);
            // 开启鼠标穿透,让窗口对鼠标操作完全不可见
            com.sun.awt.AWTUtilities.setWindowMouseTransparent(this, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 添加自定义水印面板
        add(new WatermarkPanel());
        
        // 添加ESC键关闭窗口的逻辑(无装饰窗口默认无关闭按钮)
        addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {}

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    dispose();
                    System.exit(0);
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {}
        });
        setFocusable(true);
        
        // 显示窗口
        setVisible(true);
    }

    // 自定义面板用于绘制水印
    class WatermarkPanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            // 设置水印样式:灰色粗体、48号字体
            g.setColor(java.awt.Color.GRAY);
            g.setFont(new java.awt.Font("Arial", java.awt.Font.BOLD, 48));
            
            String watermarkText = "内部文档 请勿外传";
            // 计算文字居中位置
            int textWidth = g.getFontMetrics().stringWidth(watermarkText);
            int x = (getWidth() - textWidth) / 2;
            int y = getHeight() / 2;
            
            // 旋转水印45度,模拟传统水印效果
            Graphics rotatedGraphics = g.create();
            rotatedGraphics.rotate(Math.toRadians(-45), getWidth()/2, getHeight()/2);
            rotatedGraphics.drawString(watermarkText, x, y);
            rotatedGraphics.dispose();
            
            // 如果需要平铺水印,可取消以下注释并调整参数
            /*
            int spacing = 200;
            for (int row = 0; row < getHeight(); row += spacing) {
                for (int col = 0; col < getWidth(); col += spacing) {
                    rotatedGraphics = g.create();
                    rotatedGraphics.rotate(Math.toRadians(-45), col + spacing/2, row + spacing/2);
                    rotatedGraphics.drawString(watermarkText, col, row);
                    rotatedGraphics.dispose();
                }
            }
            */
        }
    }

    public static void main(String[] args) {
        // 在Swing事件调度线程中启动窗口,避免线程安全问题
        javax.swing.SwingUtilities.invokeLater(() -> new WatermarkWindow());
    }
}

3. 运行测试

点击NetBeans的"Run"按钮启动程序,此时会出现全屏半透明的水印窗口,鼠标可正常操作底层所有应用,按ESC键可关闭水印窗口。

关键注意事项

  • 关于com.sun.awt.AWTUtilities:该类是JDK 8中的内部API,NetBeans 8.2默认搭配的JDK 8完全支持,无需额外配置。
  • 透明度调整:可修改setWindowOpacity方法的参数(0.0~1.0之间的浮点数),调整水印深浅。
  • 自定义水印:可修改paintComponent中的文字内容、字体、颜色、旋转角度,也可以替换为绘制图片水印(使用g.drawImage方法)。

内容的提问来源于stack exchange,提问作者Cabred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:15:20