Java Swing

2018-01-09 19:23 更新

Java Swing教程 - Java Swing


半透明窗口

我们可以通过使用中定义的枚举来检查是否支持透明窗口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.

并非所有平台都支持所有三种半透明形式。

以下代码显示了如何检查平台上的半透明支持。

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

上面的代码生成以下结果。



透明窗口

以下代码显示如何创建一个透明窗口。

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


渐变窗口

以下代码使用JPanel创建从左边缘的不透明到在右边缘逐渐变透明的渐变效果。

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

  }
}

形窗口

我们可以使用Swing通过使用Window类的setShape(Shape s)方法创建一个自定义形状的窗口。

使用成形窗口必须满足以下三个条件:

  • 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);
      });
  }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号