Итак, я просматривал учебные пособия по Java, однако при тестировании с классом AlphaComposite, как описано здесь: https://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html, когда я иду реализовывать их, разные атрибуты кажутся перепутанными. Например, AlphaComposite.Clear и AlphaComposite.SrcOut кажутся переключенными, а AlphaComposite.SrcIn удаляет неперекрывающиеся пиксели src, но не неперекрывающиеся целевые пиксели. Вот код, который я тестирую.
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TEST extends JFrame{
public static int width = 1200;
public static int height = 1200;
public TEST(String title) {
super(title);
this.setContentPane(new Drawer());
this.setSize(width,height);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public class Drawer extends JPanel{
BufferedImage image = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Graphics2D graphics = image.createGraphics();
graphics.setColor(Color.red);
graphics.fillRect(0, 0, 100, 100);
graphics.setColor(Color.gray);
graphics.fillRect(100, 100, 100, 100);
graphics.setComposite(AlphaComposite.SrcIn);
graphics.setColor(Color.blue);
graphics.fillRect(50, 50, 100, 100);
graphics.dispose();
g2.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
}
}
public static void main(String[] args) {
new TEST("HI");
}
}
Итак, я неправильно реализую композит или здесь что-то еще не так?
@c0der Но я думал, что точка, в которой вы устанавливаете композит, определяет, что является пунктом назначения, а что источником, причем пункт назначения — это то, что рисуется до его вызова, а источник — после. В противном случае, если вы установите композит в начале, как вы укажете, что есть что. Например, я уже говорил, что SrcIn не работает с моим кодом, как это сделать, чтобы была видна только перекрывающаяся область.
Добавьте иллюстрацию того, чего вы хотите достичь




graphics.setComposite(AlphaComposite.SrcIn);влияет только на то, что рисуется после его вызова.