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