创建一个可以点击的JFrame

我正在尝试创建一个用户可以点击的jframe。 我不是在寻找不透明而是透明度。

我需要一个适用于所有操作系统而不仅仅是Windows的解决方案,因为我无法使用

WindowUtils.setWindowTransparent(frame, true); WindowUtils.setWindowAlpha(frame, 0.6f); 

要么

 AWTUtilities.setWindowOpaque(this, false); AWTUtilities.setWindowOpacity(this, 0.8f); 

我可以单独用java来完成这个吗? 如果有一个我必须使用的库,那没关系。

编辑:我有我的jframe未修饰,这是它的代码。

 frame = new JDialog(); frame.setUndecorated(true); frame.setVisible(true); frame.setOpacity(Shared.opacity); frame.setLocation(0, 0); frame.setSize(Shared.screenWidth, Shared.screenHeight); 

当我说用户可以点击我的意思是,如果我的框架在顶部,但他们有一个窗口在我的下面,点击我的将使一个在顶部。

通过使用完全透明的背景颜色,可以在Java 7中实现完全透明的窗口,例如……

 JFrame frame = new JFrame("Testing"); frame.setUndecorated(true); frame.setBackground(new Color(0, 0, 0, 0)); 

您将遇到的问题是,任何地方都存在任何类型的固体像素(即使它是透明的),它会阻止鼠标事件超出窗口…

透明

这意味着您添加到框架中的每个子组件(您希望能够单击的组件)也需要是透明的。

我对我的一些实用程序使用了类似的技术,并在主不透明组件上包含一个MouseListener ,以使窗口更加可见,所以我可以拖动它,如果我想要它,但这是另一个问题的东西;)

 import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class ClickThroughWindow { public static void main(String[] args) { new ClickThroughWindow(); } public ClickThroughWindow() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setUndecorated(true); frame.setBackground(new Color(0, 0, 0, 0)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.setAlwaysOnTop(true); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { setOpaque(false); setLayout(new GridBagLayout()); add(new JLabel("Hello")); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(getBackground()); // g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); // g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setColor(Color.BLACK); g2d.drawRect(0, 0, getWidth() - 1, getHeight() - 1); g2d.dispose(); } } } 

您可以在如何创建半透明和形状Windows中找到更多详细信息,尤其是如何实现每像素半透明度