2013-01-05 125 views
2

我想对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; 
      } 

     } 

    } 

} 
+1

http://today.java.net/pub/a/today/2008/03/18/translucent-and-shaped-swing-windows.html这可能会有帮助。 – turnt

+0

想达到与你一样的效果。你可以找到一个解决方案here。 – Tucaen

回答

0

你可以做到这一点很容易,有多个ways.Following是示例代码你如何能做到这一点。

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

} 

有了这个,你甚至可以观看过它的现场视频。你可以调整透明度水平well.The输出如下: -

enter image description here

+3

这显示一个半透明的窗口,但它不会模糊窗口后面的图像... – pieroxy

0

您可以使用稍微不同的方式如下面的代码中给出: -

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

下面是所得到的输出,是更好的和玻璃状: -

enter image description here

+2

这不回答问题。 OP已经知道如何使窗口变得透明,问题是模糊背后的背景。 – Njol