2016-07-05 37 views
0

我正在爲我正在設計的遊戲創建一個菜單,並且我正在使用在Photoshop中設計的圖像作爲菜單的按鈕,但是我想知道是否有是任何方式來檢測鼠標是否懸停在圖像上。Java - 懸停在圖像事件

以前我已經爲常規矩形做過這個,但這個形狀不是一個基本的矩形(點擊HERE查看形狀)。

形狀被繪製爲帶有Graphics2D的BufferedImage。

預先感謝您的幫助!GYA

+0

也許這將幫助:堆棧溢出:如何確定一個點是2D凸多邊形內?(http://stackoverflow.com/questions/8721406/how-to-determine- if-a-point-is-inside-a-2d-convex-polygon) –

+0

如何查找按鈕的點? – CameronOfoluwa

回答

0

你可以映射出你的多邊形,並找出其中之一是通過添加MouseListener選擇。下次您重繪時,您可以顯示選擇。

可以檢查該事件的點包含使用的多邊形內:

[Java Docs] :: java.awt.Polygon.contains(Point)

下面是一個例子:

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) { } 
} 

下面是截圖。

Screenshot

+0

非常感謝! – CameronOfoluwa

0

您可以將的MouseListener添加到對象,併爲事件的mouseEntered編寫代碼。當鼠標第一次進入組件邊界時會觸發,但不會在點擊時觸發。 Oracle在這方面有很好的文檔。

https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html

+0

我試圖用一個正常的矩形工作正常,但我可以;噸弄清楚如何使它的形狀結束三角形工作 – CameronOfoluwa

+0

嗯,我意識到這將是一個完全痛苦的脖子,但你可以使用getXonScreen/getYonScreen,如果它位於對象的邊界內,則執行該命令。因爲斜率是一致的,你可以拿出一個公式。 –