1

I'm just wondering if there is a way to make the background of a JFrame blurred. Something like the iOS effect. Image

Is it possible In Java? I will need it for Windows and Mac.

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
Alex
  • 255
  • 2
  • 5
  • 10
  • possible duplicate of [create an transparent rectangle over blurred background in jframe](http://stackoverflow.com/questions/23215415/create-an-transparent-rectangle-over-blurred-background-in-jframe) – gtgaxiola Mar 02 '15 at 18:51
  • @gtgaxiola I had a look at that post before I post my question. If you read my question carefully, I would like to add blur effect without adding any image in the background. but the post you mentioned is for fixing that specific component and making the background image blurred. – Alex Mar 02 '15 at 19:12
  • Generally speaking, no. You "might" be able to do it using JNI/JNA, but then you run into a whole set of new issues as the core api is designed to handle it... – MadProgrammer Mar 02 '15 at 20:35
  • For windows, you'll have to look at [DWM Blur Behind Overview](https://msdn.microsoft.com/en-us/library/windows/desktop/aa969537%28v=vs.85%29.aspx) and [DwmEnableBlurBehindWindow function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa969508%28v=vs.85%29.aspx) APIs, can't say what you'd need to look at for MacOS – MadProgrammer Mar 02 '15 at 20:45

1 Answers1

4

I've been mucking about with this on and off for a while, but never really got any satisfactory results. Why? Because in order to get this to work, you need to make the window transparent (actually translucent), but when using the native look and feel decorations, the window MUST be undecorated to to work...

Blur

nb: This makes use of the TeamDev JNI Library and associated WinPack Library - cause when I started with this type of thing, JNA was still in it's infancy

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

    }

}

And the DWMBlurBehind class

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

}

Now, having said all that, if you don't care about the UI using the native look and feel, you can create a decorated frame (which uses the look and feel decorations) as demonstrated here

Community
  • 1
  • 1
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366