9
votes

I am trying to create a fullscreen window that cover the whole screen using Java. This window must also have some transparency (about 30%-50% transparent). When saying whole screen, I do mean it cover everything (including the dock/taskbar/menubar in OSX/Linux/Windows), and when I say with transparancy, I mean a real-time transparancy and not just a hacked screenshot. Here is what I am aware-of/tried:

  • Using Java Fullscreen API: while it creates a true fullscreen, you cannot have some transparency with it (only opaque color). One hack is to take a screenshot of the whole desktop and set it as background for the window, but this mean it is not real-time transparency.
  • Setting window size to match screen dimension: while it fills the whole screen, in certain OSes (e.g. Mac OS X) the window will be rendered behind the dock/menubar, and not above it. However, transparency do work here.
  • Using setWindowOpacity API: it work in the second case, but not in the first (Fullscreen API)
  • Using setBackground with alpha: it work like the setWindowOpacity, but only in certain OSes. But also doesn't work with Fullscreen API.
  • Use JFrame/JWindow/JDialog/Frame/Window: tried every window model I could, without any luck

So I am asking if this is possible through a another hack that I am not aware of, then I would be happy to hear about.

The goal is to overlay a semi-transparent fullscreen over the desktop.

1
I briefly was pursuing something similar this week. I was hoping to create a coloured filter. Mouse clicks would need to hit the items behind the filter and not the filter. I didn't research too hard, so if someone out there knows then great! - mrswadge
@mrswadge: you can add mouse listeners to your window, and then when mouse event is triggered (e.g. click), switch the window, and use java.awt.Robot to simulate the event (mousePress). This solve part of your problem. Lets hope they solve the part about true-fullscreen/transparency. - ccit

1 Answers

6
votes
  • is possible only with visible TaskBar e.i.

.

GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
  • otherwise you got and exception

.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: 
The effects for full-screen windows are not supported. 

or by using brutte_force to DirectX freezed my PC twicw, only power_off to save PC's GPU

import com.sun.awt.AWTUtilities;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameOpacityExample {

    private JFrame myFrame = new JFrame("Test Frame");
    private boolean opacity = true;
    private boolean resize = true;
    private JButton button = new JButton("Opacity");
    private JButton button1 = new JButton("Resize");

    public JFrameOpacityExample() {
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                Object src = evt.getSource();
                if (opacity) {
                    AWTUtilities.setWindowOpacity(myFrame, 0.50f);
                    opacity = false;
                } else {
                    AWTUtilities.setWindowOpacity(myFrame, 1.0f);
                    opacity = true;
                }
            }
        });
        button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                Object src = evt.getSource();
                if (resize) {
                    Rectangle dim = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
                    int h = dim.height;
                    int w = dim.width;
                    myFrame.setBounds(00, 00, w, h);
                    resize = false;
                } else {
                    myFrame.setBounds(100, 100, 400, 400);
                    resize = true;
                }
            }
        });
        JPanel panel = new JPanel();
        panel.add(button);
        panel.add(button1);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.add(panel);
        myFrame.setSize(400, 400);
        myFrame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrameOpacityExample jFrameOpacityExample = new JFrameOpacityExample();
            }
        });
    }
}