Java Swing Tutorial - Java Swing








Translucent Windows

We can check if the transparent windows are supported by using the enum defined in WindowTranslucency.

  • PERPIXEL_TRANSPARENT: A pixel in a window is either opaque or transparent. That is, the alpha value for a pixel is either 0.0 or 1.0.
  • TRANSLUCENT: all pixels in a window have the same translucency, which can be defined by an alpha value between 0.0 and 1.0.
  • PERPIXEL_TRANSLUCENT: each pixel in a window can have its own alpha value between 0.0 and 1.0. It lets we define the translucency in a window on a per pixel basis.

Not all platforms support all the three forms of translucency.

The following code shows how to check for translucency support on a platform.

import static java.awt.GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT;
import static java.awt.GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT;
import static java.awt.GraphicsDevice.WindowTranslucency.TRANSLUCENT;
//from w w  w .  ja v a  2s  .c  o m
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;

public class Main {
  public static void main(String[] args) {
    GraphicsEnvironment graphicsEnv = GraphicsEnvironment
        .getLocalGraphicsEnvironment();

    GraphicsDevice graphicsDevice = graphicsEnv.getDefaultScreenDevice();

    boolean isSupported = graphicsDevice
        .isWindowTranslucencySupported(PERPIXEL_TRANSPARENT);
    System.out.println("PERPIXEL_TRANSPARENT  supported: " + isSupported);

    isSupported = graphicsDevice.isWindowTranslucencySupported(TRANSLUCENT);
    System.out.println("TRANSLUCENT  supported: " + isSupported);

    isSupported = graphicsDevice
        .isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
    System.out.println("PERPIXEL_TRANSLUCENT  supported: " + isSupported);
  }
}

The code above generates the following result.





Transparent window

The following code shows how to create a transparent window.

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main extends JFrame {
  public Main() {
    super();
    JButton closeButton = new JButton("Close");
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setUndecorated(true);
    this.setOpacity(0.80f);
    this.setSize(200, 200);
    // Center it on the screen
    this.setLocationRelativeTo(null);
    this.add(closeButton, BorderLayout.SOUTH);
    closeButton.addActionListener(e -> System.exit(0));
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      Main frame = new Main();
      frame.setVisible(true);
    });
  }
}




Gradient Window

The following code uses JPanel to create a gradient effect from opaque at the left edge to gradually turning transparent at the right edge.

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Paint;
//  w w w.  j ava  2 s.com
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JFrame {
  public Main() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    // Make sure the frame is undecorated
    this.setUndecorated(true);
    this.setBackground(new Color(0, 0, 0, 0));
    this.setSize(200, 200);
    // Center it on the screen
    this.setLocationRelativeTo(null);

    this.getContentPane().setLayout(new GridLayout(0, 1));
    this.add(new TranslucentJPanel(Color.RED));
    JButton closeButton = new JButton("Close");
    this.add(closeButton);
    closeButton.addActionListener(e -> System.exit(0));
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      Main frame = new Main();
      frame.setVisible(true);
    });
  }
}

class TranslucentJPanel extends JPanel {
  private int red = 240;
  private int green = 240;
  private int blue = 240;

  public TranslucentJPanel(Color bgColor) {
    this.red = bgColor.getRed();
    this.green = bgColor.getGreen();
    this.blue = bgColor.getBlue();
  }

  @Override
  protected void paintComponent(Graphics g) {
    int width = this.getWidth();
    int height = this.getHeight();
    float startPointX = 0.0f;
    float startPointY = 0.0f;
    float endPointX = width;
    float endPointY = 0.0f;
    Color startColor = new Color(red, green, blue, 255);
    Color endColor = new Color(red, green, blue, 0);

    Paint paint = new GradientPaint(startPointX, startPointY, startColor,
        endPointX, endPointY, endColor);

    Graphics2D g2D = (Graphics2D) g;
    g2D.setPaint(paint);
    g2D.fillRect(0, 0, width, height);

  }
}

Shaped Window

We can use Swing to create a custom shaped window by using the setShape(Shape s) method of the Window class.

The following three criteria must be met to use a shaped window:

  • The platform must support PERPIXEL_TRANSPARENT translucency.
  • The window must be undecorated. we can make a JFrame or JDialog undecorated by calling the setUndecorated(false) method on them.
  • The window must not be in full-screen mode.
import java.awt.BorderLayout;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
/*from   w  w  w  .  j av  a 2 s. co m*/
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main extends JFrame {
  public Main() {
    this.setUndecorated(true);

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setSize(200, 200);

    Ellipse2D.Double ellipse = new Ellipse2D.Double(0, 0, 200, 100);
    Rectangle2D.Double rect = new Rectangle2D.Double(0, 100, 200, 200);

    Path2D path = new Path2D.Double();
    path.append(rect, true);
    path.append(ellipse, true);
    this.setShape(path);
    JButton closeButton = new JButton("Close");
    this.add(closeButton, BorderLayout.SOUTH);
    closeButton.addActionListener(e -> System.exit(0));
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        Main frame = new Main();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      });
  }
}