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);
});
}
}
以上内容是否对您有帮助:

免费 AI IDE


更多建议: