如何在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
相关产品推荐
相关产品推荐

