创建一个可以点击的JFrame

时间:2013-12-27 21:52:36

标签: java swing transparency

我正在尝试创建一个用户可以点击的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);

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

1 个答案:

答案 0 :(得分:4)

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

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

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

Transparent

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

我对我的一些实用程序使用了类似的技术,并在主不透明组件上包含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();
        }

    }

}

您可以在How to Create Translucent and Shaped Windows找到更多详细信息,特别是How to Implement Per-Pixel Translucency