java - 使用动态形状获取鼠标检测

标签 java image click awt java-2d

基本上我正在构建一张世界地图。我知道如何拥有方形点击区域。但我想做到这一点,这样我就可以将这些国家放在一起并能够点击该国家/地区。现在很明显我不能为此使用方形点击区域,因为我会有重叠的点击区域。我可以通过查看每个像素的透明度来做到这一点吗?即便如此我也不知道该怎么做?

最佳答案

使用Shape.contains(Point2D) - 像这样:

Shape Containment

此示例使用重叠的椭圆来展示 contains(..) 方法如何准确地识别鼠标单击落在哪些椭圆内。但是您所指的那种 map 可能由许多 GeneralPath 组成。不重叠的对象(每个国家一个)。

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.BasicStroke;
import java.awt.RenderingHints;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.io.File;
import java.util.*;
import javax.imageio.ImageIO;

public class ShapeContainment {

    List<Ellipse2D> shapes = new ArrayList<Ellipse2D>();
    int w = 400;
    int h = 100;
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Point2D mouse = new Point2D.Double(0, 0);
    JLabel l;

    ShapeContainment() {
        Random r = new Random();
        for (int ii = 0; ii < 10; ii++) {
            int x = r.nextInt(w / 2);
            int y = r.nextInt(h / 2);
            int wE = r.nextInt(w - x);
            int hE = r.nextInt(h - y);
            Ellipse2D ellipse = new Ellipse2D.Double(x, y, wE, hE);
            shapes.add(ellipse);
        }
        l = new JLabel(new ImageIcon(img));
        MouseAdapter listener = new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent me) {
                mouse = me.getPoint();
                drawImage();
            }
        };
        l.addMouseListener(listener);
        drawImage();

        JOptionPane.showMessageDialog(null, l);
    }

    public void drawImage() {
        Graphics2D g = img.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, w, h);

        RenderingHints hints = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHints(hints);

        Color bg = new Color(0, 128, 0, 60);
        Color inside = new Color(0, 0, 255, 120);
        Color outside = new Color(255, 0, 0, 120);
        g.setStroke(new BasicStroke(4));
        for (Ellipse2D shape : shapes) {
            g.setColor(bg);
            g.fill(shape);
            if (shape.contains(mouse)) {
                g.setColor(inside);
            } else {
                g.setColor(outside);
            }
            g.draw(shape);
        }
        g.setColor(Color.RED);
        int x = (int) mouse.getX();
        int y = (int) mouse.getY();
        g.setStroke(new BasicStroke(2));
        int s = 3;
        g.drawLine(x-s, y, x+s, y);
        g.drawLine(x, y-s, x, y+s);
        l.setIcon(new ImageIcon(img));

        g.dispose();

        try {
            ImageIO.write(
                    img,
                    "png",
                    new File(System.currentTimeMillis() + ".png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Runnable run = new Runnable() {

            @Override
            public void run() {
                new ShapeContainment();
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(run);
    }
}

关于java - 使用动态形状获取鼠标检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13795236/

相关文章:

java - 如何创建一个类来对java中的文件进行排序

python - Scipy 二进制关闭 - 边缘像素失去值(value)

python - Selenium Python sel.click ("css=input.smthg")?

javascript - 单击时强制悬停状态辅助元素

java - 正则表达式java从txt文件中查找字符串

java - Spring MVC 用户数据更新问题

c++ - 使用 OpenCV 如何根据 x 和 y 坐标裁剪图像,并允许 x 和 y 坐标作为裁剪的中心?

java - 扫描下一次鼠标单击(并使用...与...)

java - Android 未处理的异常

image - 更改四开演示中的图像大小