不要使用
getGraphics,这不是自定义绘画的工作方式,有关更多详细信息,请参见“
AWT中的绘画”和“摇摆和
执行自定义绘画 ”
基本思想是,您需要某种
List,您可以在其中添加每个形状。
mouseClicked发生这种情况时,您遍历列表并检查单击的鼠标是否出现了其中一种形状,如果是,则将其从中删除
List,如果没有,则在单击时创建一个新形状并添加它到
List。
然后,您可以
List在
paintComponent方法内部使用它来物理绘制形状。
本示例扩展了您
ImagePanel在自定义绘画中的添加
import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Shape;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.geom.Ellipse2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.imageio.ImageIO;import javax.swing.ImageIcon;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } Jframe frame = new Jframe("Testing"); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); frame.add(new DrawPane("/Volumes/Disk02/Dropbox/MegaTokyo/thumnails/0.jpg")); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ImagePanel extends JPanel { private Image img; public ImagePanel(String img, String str) { //this(new ImageIcon(img).getImage()); } public ImagePanel(String path) { Image img = new ImageIcon(path).getImage(); this.img = img; try { BufferedImage image = ImageIO.read(new File(path)); int rgb = image.getRGB(66, 52); System.out.println("Colour is: " + rgb); } catch (IOException e) { e.printStackTrace(); } } @Override public Dimension getPreferredSize() { return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(this), img.getHeight(this)); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(img, 0, 0, null); } } public class DrawPane extends ImagePanel { private List<Shape> shapes; public DrawPane(String img, String str) { super(img, str); init(); } public DrawPane(String path) { super(path); init(); } protected void init() { shapes = new ArrayList<>(25); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { boolean clicked = false; Iterator<Shape> it = shapes.iterator(); while (it.hasNext()) { Shape shape = it.next(); if (shape.contains(e.getPoint())) { it.remove(); clicked = true; break; } } if (!clicked) { shapes.add(new Ellipse2D.Double(e.getX() - 10, e.getY() - 10, 20, 20)); } repaint(); } }); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.RED); for (Shape shape : shapes) { g2d.draw(shape); } g2d.dispose(); } }}


