2013-01-05 128 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