如何在java swing应用程序中保留和删除多个图形对象?

我有一个图像,我在其上使用预定义的位置来创建带有颜色的图形对象。 点击鼠标,我尝试用颜色创建一些椭圆形。 实际上我无法实现这一目标。 因为,当我点击预定位置时,我可以在其上创建一个椭圆形但是当我点击另一个预定义位置时,第一个椭圆形已经消失了。

通过点击两次可以去除椭圆形。

看看这个,

public class PrintDialog extends javax.swing.JDialog{ private int count = 0; private int count_1 = 0; /** * Creates new form PrintFeetDialog */ public PrintDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); ImagePanel panel = new ImagePanel("Areas.jpg"); this.getContentPane().add(panel); this.setResizable(false); this.setLocationRelativeTo(panel); this.pack(); } private void formMouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: System.out.println("Print y - " + evt.getY()); System.out.println("Print x - " + evt.getX()); if ((evt.getX() >= 68 && evt.getX() = 44 && evt.getY()  1) { g.setColor(new Color(-3692899)); g.fillOval(66, 52, 20, 20); repaint(); count = 0; } g.dispose(); } if ((evt.getX() >= 137 && evt.getX() = 50 && evt.getY()  1) { g1.setColor(new Color(-3692899)); g1.fillOval(66, 52, 20, 20); repaint(); count_1 = 0; } g1.dispose(); } } } 

图像面板类

 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; Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); setPreferredSize(size); setMinimumSize(size); setMaximumSize(size); setSize(size); setLayout(null); 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(); } } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(img, 0, 0, null); } } 

请问有什么想法吗?

谢谢 。

不要使用getGraphics ,这不是自定义绘画的工作方式,请参阅AWT绘画和Swing以及执行自定义绘画了解更多详情

基本的想法是,你需要某种List ,你可以在其中添加每个形状。 当mouseClicked发生时,你遍历列表并检查点击鼠标是否出现其中一个形状,如果是,你从List删除形状,如果没有,你在点击它时创建一个新形状,将其添加到List

然后,您可以在paintComponent方法中使用此List来物理绘制形状。

此示例扩展了您在自定义绘画中添加的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 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 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(); } } }