当前位置: 首页 > 面试题库 >

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

章安宜
2023-03-14
问题内容

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

可以通过单击椭圆两次将其删除。

看看这个,

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中的绘画”和“摇摆和
执行自定义绘画 ”

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

然后,您可以ListpaintComponent方法内部使用它来物理绘制形状。

示例扩展了您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();
        }

    }

}


 类似资料:
  • 我有一个要求,我需要采取我的一些文件的副本,并把它放在内部服务器。这需要定期发生,比如每天晚上8点。这也是一个Swing应用程序,在我的本地PC上运行。我知道我可以使用Java计划任务,或者使用,或者更好的。 但是,问题来了。没有人会仅仅为了这个调度器就让计算机开机24小时。据我所知,如果有人重启电脑,Java调度器也会死掉。相反,一旦任务计划完成,如果计算机已打开,则计划的任务应在每天晚上8点进

  • 当我尝试运行一个新的Swing应用程序时,我遇到了一些重大问题。我使用的是NetBeans 8.1、JDK版本1.8和OS Windows 10。 所以每次我试图打开一个新的Swing项目(不管它是应用项目还是EA),并且我运行它,NetBeans都会正确部署它,但是Swing窗口没有打开,在NetBeans的状态栏中它只是显示正在运行。我等了几分钟,然后我不得不停止构建,因为什么都没发生。当我在

  • 有人知道如何巧妙地删除图像吗? 非常感谢!

  • 这里有一个 Silicon info 的 App,但是这个 app 好像没了 但是这个图标一直残留着,怎么清除这个残留的图标

  • 我正在使用notificationcompat.builder构建通知,我基本上遵循以下指南:http://developer.android.com/guide/topics/ui/notifiers/notifications.html 通知小图标是设计在Android状态栏中显示的小白唯一版本。 问题是,无论我做什么,相同的图标是用来指示原始应用程序的,我只是想隐藏它,因为我的应用程序图标也