2015-03-02 114 views
0

我只是想知道是否有辦法讓JFrame的背景模糊。就像iOS效果一樣。 Image如何讓透明的JFrame模糊背景

是否有可能在Java中? 我將在Windows和Mac上使用它。

+0

可能重複[在jframe中模糊背景中創建透明矩形](http://stackoverflow.com/questions/23215415/create-an-transparent-rectangle-over-blurred-background-in-jframe) – gtgaxiola 2015-03-02 18:51:58

+0

@gtgaxiola我看了一下在我發佈我的問題之前在那個職位。如果您仔細閱讀我的問題,我想添加模糊效果而不在背景中添加任何圖像。但是您提到的帖子是爲了修復該特定組件並使背景圖像模糊。 – Alex 2015-03-02 19:12:05

+0

一般來說,沒有。你「可能」能夠使用JNI/JNA來完成它,但是隨後你會遇到一整套新的問題,因爲核心API被設計來處理它... – MadProgrammer 2015-03-02 20:35:11

回答

2

我一直在關閉這個開關一段時間,但從來沒有真正得到任何滿意的結果。爲什麼?因爲爲了得到這個工作,你需要使窗口透明(實際上半透明),但使用本機的外觀和感覺的裝飾時,該窗口必須以未修飾的工作......

Blur

注:這使得利用TeamDev JNI Library and associated WinPack Library的 - 因爲當我開始使用這種類型的東西,JNA仍然在它的嬰兒期

import com.jniwrapper.Function; 
import com.jniwrapper.Library; 
import com.jniwrapper.Parameter; 
import com.jniwrapper.Pointer; 
import com.jniwrapper.UInt32; 
import com.jniwrapper.win32.ui.Wnd; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.GridBagLayout; 
import java.awt.Window; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 

public class TestDWM { 

    public static void main(String[] args) { 
     new TestDWM(); 
    } 

    public TestDWM() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       final JFrame frame = new JFrame(); 
       frame.setUndecorated(true); 
       frame.setBackground(new Color(0, 0, 0, 0)); 

       TranslucentPane panel = new TranslucentPane(); 
       frame.setContentPane(panel); 

       panel.setBorder(new EmptyBorder(40, 40, 40, 40)); 

       frame.setLayout(new GridBagLayout()); 
       JLabel label = new JLabel("I'm a banana"); 
       label.setFont(label.getFont().deriveFont(Font.BOLD, 48f)); 
       frame.add(label); 

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setAlwaysOnTop(true); 
       frame.setVisible(true); 

       setBlurBehind(frame); 
      } 
     }); 
    } 

    public class TranslucentPane extends JPanel { 

     public TranslucentPane() { 
      setOpaque(false); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Color color = getBackground(); 
      color = new Color(color.getRed(), color.getGreen(), color.getBlue(), 32); 
      g.setColor(color); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
     } 

    } 

    public static void setBlurBehind(Window window) { 

     Wnd wnd = new Wnd(window); 
     Library libDWMAPI = new Library("Dwmapi"); 
     Function fEnableBlurBehindWindow = libDWMAPI.getFunction("DwmEnableBlurBehindWindow"); 
     DWMBlurBehind behind = new DWMBlurBehind(); 

     System.out.println("wnd = " + wnd); 

     UInt32 dwResult = new UInt32(0); 
     long hResult = fEnableBlurBehindWindow.invoke(
         dwResult, 
         new Parameter[]{ 
          wnd, 
          new Pointer(behind) 
         }); 

     System.out.println("hResult = " + hResult); 
     System.out.println("dwResult = " + dwResult.getValue()); 

    } 

} 

而且DWMBlurBehind

現在
import com.jniwrapper.Int; 
import com.jniwrapper.Parameter; 
import com.jniwrapper.Pointer; 
import com.jniwrapper.Structure; 
import com.jniwrapper.UInt32; 
import windows.WinDef; 

public class DWMBlurBehind extends Structure { 

    public static final int DWM_BB_ENABLED = 0x1; 
    public static final int DWM_BB_BLURREGION = 0x2; 
    public static final int DWM_BB_TRANSITIONONMAXIMIZED = 0x4; 

    private UInt32 dwFlags; 
    private Int enabled; 
    private Pointer.Void region; 
    private Int transitionOnMazimized; 

    public DWMBlurBehind() { 

     dwFlags = new UInt32(DWM_BB_ENABLED); 
     enabled = new Int(WinDef.TRUE); 
     transitionOnMazimized = new Int(WinDef.TRUE); 
     region = new Pointer.Void(); 
     init(new Parameter[] 
     { 
      dwFlags, 
      enabled, 
      region, 
      transitionOnMazimized 
     }); 
    } 

    public long getFlags() { 
     return dwFlags.getValue(); 
    } 

} 

,說了這麼多,如果你沒有對UI使用本機外觀關心和感覺,你可以創建一個裝飾框(它使用外觀和感覺的裝飾)作爲demonstrated here