我正在为我正在设计的游戏创建一个菜单,并且我正在使用在Photoshop中设计的图像作为菜单的按钮,但是我想知道是否有是任何方式来检测鼠标是否悬停在图像上。Java - 悬停在图像事件
以前我已经为常规矩形做过这个,但这个形状不是一个基本的矩形(点击HERE查看形状)。
形状被绘制为带有Graphics2D的BufferedImage。
预先感谢您的帮助!GYA
我正在为我正在设计的游戏创建一个菜单,并且我正在使用在Photoshop中设计的图像作为菜单的按钮,但是我想知道是否有是任何方式来检测鼠标是否悬停在图像上。Java - 悬停在图像事件
以前我已经为常规矩形做过这个,但这个形状不是一个基本的矩形(点击HERE查看形状)。
形状被绘制为带有Graphics2D的BufferedImage。
预先感谢您的帮助!GYA
你可以映射出你的多边形,并找出其中之一是通过添加MouseListener
选择。下次您重绘时,您可以显示选择。
可以检查该事件的点包含使用的多边形内:
下面是一个例子:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;
public class PolygonDetectorPanel extends JPanel implements MouseListener {
private static final long serialVersionUID = -8929816396666863908L;
private BufferedImage backgroundImage;
private List<Polygon> shapes;
private Polygon selectedPoly;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Polygon Detector");
PolygonDetectorPanel panel = new PolygonDetectorPanel();
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public PolygonDetectorPanel() {
super();
initialize();
this.addMouseListener(this);
}
protected void initialize() {
try {
InputStream is = PolygonDetectorPanel.class.getClassLoader().getResourceAsStream("resources/buttons.png");
this.backgroundImage = ImageIO.read(is);
} catch (IOException e) {
e.printStackTrace();
}
int width = this.backgroundImage.getWidth();
int height = this.backgroundImage.getHeight();
this.setPreferredSize(new Dimension(width, height));
this.shapes = new ArrayList<Polygon>();
int buttonStartX = 13;
int buttonStartY = 54;
int buttonOffset = 100;
for (int i = 0; i < 4; i++) {
int[] w = { buttonStartX , buttonStartY + 33 + (i * buttonOffset) };
int[] nw = { buttonStartX + 50 , buttonStartY + (i * buttonOffset) };
int[] ne = { buttonStartX + 300 , buttonStartY + (i * buttonOffset) };
int[] e = { buttonStartX + 350 , buttonStartY + 33 + (i * buttonOffset) };
int[] se = { buttonStartX + 300 , buttonStartY + 66 + (i * buttonOffset) };
int[] sw = { buttonStartX + 50 , buttonStartY + 66 + (i * buttonOffset) };
int[] xPoints = { w[0], nw[0], ne[0], e[0], se[0], sw[0], w[0]};
int[] yPoints = { w[1], nw[1], ne[1], e[1], se[1], sw[1], w[1]};
this.shapes.add(new Polygon(xPoints, yPoints, 6));
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (this.backgroundImage != null) {
g.drawImage(this.backgroundImage, 0, 0, null);
}
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 10.0f));
for (Polygon poly : this.shapes) {
if (poly == this.selectedPoly) {
g.setColor(Color.GREEN);
} else {
g.setColor(Color.RED);
}
g.drawPolygon(poly);
}
}
protected Polygon getClickedShape(Point point) {
for (Polygon poly : this.shapes) {
if (poly.contains(point)) {
return poly;
}
}
return null;
}
@Override
public void mouseClicked(MouseEvent e) {
Polygon poly = getClickedShape(new Point(e.getX(), e.getY()));
if (poly != null) {
this.selectedPoly = poly;
} else {
this.selectedPoly = null;
}
repaint();
}
@Override
public void mousePressed(MouseEvent e) { }
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
}
下面是截图。
非常感谢! – CameronOfoluwa
您可以将的MouseListener添加到对象,并为事件的mouseEntered编写代码。当鼠标第一次进入组件边界时会触发,但不会在点击时触发。 Oracle在这方面有很好的文档。
https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html
我试图用一个正常的矩形工作正常,但我可以;吨弄清楚如何使它的形状结束三角形工作 – CameronOfoluwa
嗯,我意识到这将是一个完全痛苦的脖子,但你可以使用getXonScreen/getYonScreen,如果它位于对象的边界内,则执行该命令。因为斜率是一致的,你可以拿出一个公式。 –
也许这将帮助:堆栈溢出:如何确定一个点是2D凸多边形内?(http://stackoverflow.com/questions/8721406/how-to-determine- if-a-point-is-inside-a-2d-convex-polygon) –
如何查找按钮的点? – CameronOfoluwa