使用动态形状获取鼠标检测 [英] Get mouse detection with a dynamic shape
问题描述
基本上我正在构建一个世界地图。我知道如何有一个方形的点击区域。但我想让它,所以我可以把国家在一起,并能点击国家。现在很明显,我不能使用方形点击区域,因为我会有重叠的点击区域。我可以通过查看每个像素的透明度吗?即使这样,我不知道该怎么做?
使用 Shape.contains(Point2D)
- 像这样:
如何包含(..)方法将准确识别鼠标点击在哪些椭圆内。但你所指的地图类型可能会由一些 Basically I'm constructing a world map. I know how to have a square click area. But I'd like to make it so I can put the countries together and be able to click on the country. Now it's pretty obvious that I can't use square click areas for that because I'd have overlapping click areas. Could I do it by looking at the transparency of each pixel? Even so I don't know how to do that? Use This example uses overlapping ellipses to show how the
这篇关于使用动态形状获取鼠标检测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
pre> 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 RenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHints(hints);
颜色bg =新颜色(0,128,0,60);
color inside = new Color(0,0,255,120);
颜色outside = new颜色(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(){
@覆盖
public void run(){
new ShapeContainment();
}
};
// Swing GUI应该在EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater上创建和更新(跑);
}
}
Shape.contains(Point2D)
- something like this:contains(..)
method will accurately identify which ovals the mouse click falls inside. But the kind of map you are referring to will probably be made of a number of GeneralPath
objects (one for each country) that do not overlap.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);
}
}