JFrame与模糊透明背景

我想在JFrame的背景上做一个模糊,它是透明的,以显示它下面发生的事情,但我不知道如何模糊背景并避免闪烁。 我想要实现的是透明的背景,模糊不清,但仍然显示其下方窗户的“实时视图”,而不是模糊的静态图片不会改变。 请记住,窗口可能会占据全屏大小。

我希望我能正确描述它,因为我还是Java Graphics的初学者。

代码中的透明框架:

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 } } } 

注意 – 框架是完全透明的,并且看到某些效果会将颜色更改为例如。

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

谢谢你的帮助

编辑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; } } } } 

您可以非常轻松地完成此操作,并且有多种方法。以下是示例代码,您可以如何执行此操作。

 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();}}); } } 

有了这个,您甚至可以通过它观看实时video。您也可以调整透明度。输出如下: –

在此处输入图像描述

您可以使用以下代码中给出的略有不同的方式: –

 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()); }*/ } 

这是获得的输出更好和玻璃状: –

在此处输入图像描述