【问题标题】:Get mouse detection with a dynamic shape使用动态形状获取鼠标检测
【发布时间】:2012-11-27 12:41:51
【问题描述】:

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

【问题讨论】:

    标签: java image click awt java-2d


    【解决方案1】:

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

    本示例使用重叠椭圆来展示contains(..) 方法如何准确识别鼠标单击落在哪个椭圆内。但是您所指的那种地图可能由许多不重叠的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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多