创建一个可以点击的JFrame

use*_*619 5 java swing transparency

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

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

WindowUtils.setWindowTransparent(frame, true);
WindowUtils.setWindowAlpha(frame, 0.6f);
Run Code Online (Sandbox Code Playgroud)

要么

AWTUtilities.setWindowOpaque(this, false);
AWTUtilities.setWindowOpacity(this, 0.8f);
Run Code Online (Sandbox Code Playgroud)

我可以单独用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);
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*mer 4

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

JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
Run Code Online (Sandbox Code Playgroud)

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

透明的

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

我对我的一些实用程序使用了类似的技术,并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();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

您可以在如何创建半透明和形状的窗口中找到更多详细信息,特别是如何实现每像素半透明