Obtenga la detección del mouse con una forma dinámica

Básicamente estoy construyendo un mapa del mundo. Sé cómo tener un área de clic cuadrado. Pero me gustaría hacerlo para poder unir a los países y poder hacer clic en el país. Ahora es bastante obvio que no puedo usar áreas de clic cuadrado porque tendré áreas de clic superpuestas. ¿Podría hacerlo mirando la transparencia de cada píxel? Aun así, no sé cómo hacer eso?

Use Shape.contains(Point2D) – algo como esto:

Contención de forma

Este ejemplo utiliza elipsis superpuestas para mostrar cómo el método contains(..) identificará con precisión en qué óvalos se ubica el clic del mouse. Pero el tipo de mapa al que se refiere probablemente estará formado por varios objetos de GeneralPath (uno para cada país) que no se superponen.

 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 shapes = new ArrayList(); 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(xs, y, x+s, y); g.drawLine(x, ys, 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); } }