简体   繁体   English

JFrame具有模糊的透明背景

[英]JFrame with blurred transparent background

I would like to do a blur on the background of the JFrame which is transparent to show what is happening underneath it, but I have no idea how can I blur the background and avoid flickering. 我想对JFrame的背景进行模糊处理,以透明的方式显示其下发生的事情,但是我不知道如何模糊背景并避免闪烁。 What I want to achieve is to have a transparent background which is slighlty blurred, but still shows "live view" of the windows underneath it, not to have a blurred static picture which doesn't change. 我要实现的是拥有一个透明的背景,该背景模糊不清,但仍在其下面的窗口中显示“实时视图”,而不是具有不变的模糊静态图片。 Keep in mind that the window may take the size of full screen. 请记住,窗口可能会占据全屏的大小。

I hope I described it correctly, as I am still a beginner in Java Graphics. 希望我能正确地描述它,因为我还是Java Graphics的初学者。

The transparent frame in code: 代码中的透明框:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;

public class BlurredBackgroundWindow {

    public static void main(String[] args) {
        new BlurredBackgroundWindow().drawGUI();
    }

    public void drawGUI() {
        myJFrame frm = new myJFrame();
        frm.setTitle("BlurredBackgroundWindow");
        frm.setSize(480, 360);
        frm.setUndecorated(true);
        frm.setBackground(new Color(0,0,0,1));
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frm.setVisible(true);
    }

    class myJFrame extends JFrame {

        public void paint(Graphics g) {
            super.paint(g);

            // Doing the rest of painting here
        }

    }

}

Note - The frame is completely transparent and to see some effect change the color to eg. 注意-框架是完全透明的,要看到某种效果,请将颜色更改为例如。

frm.setBackground(new Color(0,100,0,100));

Thanks for any help 谢谢你的帮助

EDIT 1: Here is the effect in action WITH the flickering which I want to avoid, but I don't really know how... This one works for a fullscreen window only. 编辑1:这是我要避免的闪烁效果,但我真的不知道如何...这仅适用于全屏窗口。

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;

public class BlurredBackgroundWindow {

    public static int FPS = 2;
    private BufferedImage temp = null;
    private BufferedImage out = null;
    private BufferedImage image = null;

    myJFrame frm = new myJFrame();

    public static void main(String[] args) {
        new BlurredBackgroundWindow().drawGUI();
    }

    public void drawGUI() {
        frm.setTitle("BlurredBackgroundWindow");
        frm.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frm.setUndecorated(true);
        frm.setBackground(new Color(0,0,0,1));
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frm.setVisible(true);

        Timer bcg = new Timer();
        bcg.schedule(new TimerTask() {

            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            Rectangle screenRectangle = new Rectangle(screenSize);
            Robot robot;

            public void run() {

                System.out.println("Repaint");
                frm.repaint();
                try {
                    robot = new Robot();
                    image = robot.createScreenCapture(screenRectangle);
                } catch (AWTException e) {}
                frm.repaint();
                // Save the blurred image for debugging
                /*try {
                    ImageIO.write(image, "png", new File("C:\\test.png"));
                } catch (IOException e) {
                    e.printStackTrace();
                }*/

            }

        }, 0, (int) (1000f/FPS));
    }

    class myJFrame extends JFrame {

        public void paint(Graphics g) {
            super.paint(g);

            if(image != null) {
                   float[] matrix = {
                            0.111f, 0.111f, 0.111f, 
                            0.111f, 0.111f, 0.111f, 
                            0.111f, 0.111f, 0.111f, 
                        };
                        BufferedImageOp op = new ConvolveOp( new Kernel(3, 3, matrix) );
                        temp = op.filter(image, out);
                        out = temp;
                g.drawImage(out,0,0,null);
                temp=null;out=null;image=null;
            }

        }

    }

}

You can do this very easily and there are multiple ways.Following is the sample code how you can do this. 您可以很容易地做到这一点,并且有多种方法。下面是示例代码。

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsDevice.WindowTranslucency;
import java.awt.GraphicsEnvironment;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class transparentWindow extends JFrame {

public transparentWindow() {
    // TODO Auto-generated constructor stub
    //JFrame jfrm=new JFrame("Transparent Window");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300,200);
    getContentPane().setLayout(new FlowLayout());
    //setBackground(new Color(0,0,0,0));

    add(new JButton("Enter"));
    setOpacity(0.7f);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd=ge.getDefaultScreenDevice();
    if(!gd.isWindowTranslucencySupported(WindowTranslucency.TRANSLUCENT))
    {
        System.out.println("Transparency not supported");
        System.exit(0);
    }
    JFrame.setDefaultLookAndFeelDecorated(true);
    SwingUtilities.invokeLater(new Runnable(){public void run(){new transparentWindow();}});
}

}

With this you can even watch the live video through it .You can adjust the transparency level as well.The output is as follows :- 有了它,您甚至可以通过它观看实时视频。您还可以调整透明度。输出如下:-

在此处输入图片说明

You can use slightly different way as given in the following code :- 您可以使用以下代码中给出的稍微不同的方法:

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsDevice.WindowTranslucency;
import java.awt.GraphicsEnvironment;
import java.awt.Paint;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;


public class transparent extends JFrame {

public transparent() {
    super("Transparent Window");
    setBackground(new Color(0,0,0,0));

    //setting it causes the frame to be transparent .Hence both panel and frame are transparent.
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300,200);
    getContentPane().setLayout(new FlowLayout());


    JPanel jp=new JPanel(){
        public void paintComponent(Graphics g)
        {
            //super.paintComponent(g);
            Graphics2D g2=(Graphics2D)g;
            Paint gp=new GradientPaint(0, 0, new Color(100,20,210,105), 0, 200, new Color(80,20,40,105));
            g2.setPaint(gp);
            g2.fillRect(0, 0, getWidth(),getHeight());
        }
    };
    //setOpacity(0.6f);
    setContentPane(jp);
    JButton jbtn=new JButton("Enter");
    jp.add(jbtn);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd=ge.getDefaultScreenDevice();
    if(!gd.isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT))
    {
        System.out.println("Per-pixel Transency not supported");
        System.exit(0);
    }
    JFrame.setDefaultLookAndFeelDecorated(true);

    //setting it to true causes the look to be handled by look and feel. otherwise os look and feel is used
    //In other words ,it is,modify default look and feel-yes or no?
    SwingUtilities.invokeLater(new Runnable(){public void run(){new transparent();}});
}
/*public void paint(Graphics g)
{
    super.paint(g);
    Graphics2D g2=(Graphics2D)g;
    GradientPaint gp=new GradientPaint(0, 0, new Color(20,20,210,30), 300, 200, new Color(10,20,40,255),true);
    g2.setPaint(gp);
    g2.fillRect(0, 0, getWidth(),getHeight());
}*/
}

Here is the output obtained which is much better and glassy :- 这是获得的输出,效果更好,效果更好:-

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM