您使用的规则错误-请勿使用AlphaComposite.CLEAR。
AlphaComposite API声明有关CLEAR:
目的地的颜色和Alpha均被清除(Porter-Duff清除规则)。源和目的地均不用作输入。
因此,这将使图像消失。尝试其他规则。在创建SSCCE时,我创建了我的。查看当您注释掉另一条规则线时会发生什么。例如更改此
// int rule = AlphaComposite.CLEAR;int rule = AlphaComposite.SRC_OVER;
对此:
int rule = AlphaComposite.CLEAR;// int rule = AlphaComposite.SRC_OVER;
整个SSCCE:
import java.awt.AlphaComposite;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Composite;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.Stroke;import java.awt.image.BufferedImage;import javax.swing.*;public class TestAlphaComposite extends JPanel { private static final int PREF_W = 400; private static final int PREF_H = PREF_W; private static final Stroke BASIC_STROKE = new BasicStroke(6f); BufferedImage backgroundImage; BufferedImage overlayImage; public TestAlphaComposite() { backgroundImage = createBackGroundImage(); overlayImage = createOverlayImage(); } private BufferedImage createBackGroundImage() { BufferedImage img = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = img.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(BASIC_STROKE); g2.setColor(Color.blue); int circleCount = 10; for (int i = 0; i < circleCount ; i++) { int x = (i * PREF_W) / (2 * circleCount); int y = x; int w = PREF_W - 2 * x; int h = w; g2.drawOval(x, y, w, h); } g2.dispose(); return img; } private BufferedImage createOverlayImage() { BufferedImage img = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = img.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(BASIC_STROKE); g2.setColor(Color.red); int circleCount = 10; for (int i = 0; i < circleCount + 1; i++) { int x1 = (i * PREF_W) / (circleCount); int y1 = 0; int x2 = PREF_W - x1; int y2 = PREF_H; float alpha = (float)i / circleCount; if (alpha > 1f) { alpha = 1f; } // int rule = AlphaComposite.CLEAR; int rule = AlphaComposite.SRC_OVER; Composite comp = AlphaComposite.getInstance(rule , alpha ); g2.setComposite(comp ); g2.drawLine(x1, y1, x2, y2); } g2.dispose(); return img; } @Override public Dimension getPreferredSize() { return new Dimension(PREF_W, PREF_H); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (backgroundImage != null) { g.drawImage(backgroundImage, 0, 0, null); } if (overlayImage != null) { g.drawImage(overlayImage, 0, 0, null); } } private static void createAndShowGui() { Jframe frame = new Jframe("TestAlphaComposite"); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); frame.getContentPane().add(new TestAlphaComposite()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); }}顺便说一句,您的SSCCE不是真正的SSCCE。我们任何人都不可能编译或运行该代码,因为它具有我们无法访问的依赖项,即“
com.blazingkin.atrox.ScreenManager”。如果将来需要我们的帮助,则需要编写更好的sscce。



