我想在 Java 中创建一个透明的叠加层,始终位于顶部,并且我可以点击。我发现了一些关于这个问题的类似 帖子,但即使按照他们的回答,我也遇到了一个问题。
我的问题是让整个窗口点击通过。让它与 JFrame 一起工作没有任何问题,但是一旦我向它添加任何组件(JLabel 或 ImagePanel),点击属性就不会传递给它们。
因为我想为我的应用程序创建一个背景图像,所以这基本上使我无法查看每当我单击文本/图像覆盖的区域时窗口如何聚焦的代码。
在我展示我正在使用的代码之前,我首先想参考这些 线程,它们基本上准确地描述了我想要的东西,除了 C#。
我的目标是创建一个带有透明 .png 图像的叠加层,顶部的一些文本会随关键事件发生变化。如果它使用 JFrame 或任何其他库都没关系。我只需要它与 Windows 兼容。
我还想提一下,我对 Java 有一些经验,但我是使用 JFrame 的新手。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import com.sun.jna.platform.WindowUtils;
public class Overlay {
public static void main(String[] args) {
JFrame frame = new JFrame("Overlay Window");
frame.setUndecorated(true);
frame.setAlwaysOnTop(true);
frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false);
frame.setLocation(400, 400);
frame.getContentPane().setLayout(new java.awt.BorderLayout());
JLabel textLabel = new JLabel("I'm a label in the window", SwingConstants.CENTER);
frame.getContentPane().add(textLabel, BorderLayout.CENTER);
frame.pack();
System.setProperty("sun.java2d.noddraw", "true");
WindowUtils.setWindowTransparent(frame, true);
WindowUtils.setWindowAlpha(frame, 1.0f);
//Using AWTUtilities gives the same result as WindowUtils
//AWTUtilities.setWindowOpaque(frame, false);
//AWTUtilities.setWindowOpacity(frame, 1.0f);
frame.setVisible(true);
}
}
请注意,问题不在于窗口被聚焦(尽管这是问题的结果),而在于JLabel 和 ImagePanel 不是 click-through。