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

2023-12-07

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

单击椭圆形两次即可将其删除。

看看这个,

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() <= 84) && (evt.getY() >= 44 && evt.getY() <= 72))
    {
        Graphics g = getGraphics();
        count++;
        if (count == 1)
        {
            g.setColor(Color.red);
            g.fillOval(66, 52, 20, 20);
            //  repaint();
        } else if (count > 1)
        {
            g.setColor(new Color(-3692899));
            g.fillOval(66, 52, 20, 20);
            repaint();
            count = 0;
        }
        g.dispose();
    }

    if ((evt.getX() >= 137 && evt.getX() <= 157) && (evt.getY() >= 50 && evt.getY() <= 75))
    {
        Graphics g1 = getGraphics();
        count_1++;
        if (count_1 == 1)
        {
            g1.setColor(Color.RED);
            g1.fillOval(137, 54, 20, 20);
        } else if (count_1 > 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 中绘画 and 进行定制绘画更多细节

基本思想是,你需要某种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();
        }

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Junit Mockito 测试一切

    我现在正在寻找更多时间但没有结果 请帮忙 这是我要测试的课程 public class DBSelectSchema extends Database private static final Logger LOG Logger getLo
  • 如何监听场景图节点中的WindowEvent.WINDOW_SHOWN?

    似乎 WindowEvent WINDOW SHOWN 永远不会在场景图中的任何节点上分派 也没有 我能找到的 知道节点何时可见 渲染 显示 例如 测试启动器 java package com example javafx event im
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • 如何知道 glassfish 是什么 - 完整平台或网络配置文件?

    我已经安装了glassfish 我可以跑 asadmin version 它显示了它是什么版本 但如何知道它是 完整平台 还是 Web 配置文件 你可以使用 glassfish4 bin gt asadmin list containers
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • Android 反向地理编码不适用于华为设备

    我正在尝试通过这段代码反转地理编码纬度 经度 Geocoder geocoder new Geocoder context Locale ENGLISH try List
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • 如何从 jenkins 的现有项目生成 .hpi 插件

    我正在尝试使用 jenkins 的性能插件 但最新版本存在一些问题 如链接中所述 https issues jenkins ci org browse JENKINS 27100 https issues jenkins ci org br
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种

随机推荐