2016-07-05 20 views
0

私は現在デザインしているゲームのメニューを作成しています。私はPhotoshopでデザインしたイメージを使ってメニューのボタンとして使用していますが、マウスが画像の上をホバリングしているかどうかを検出する方法です。Java - Hover Over Imageイベント

私はこれまで通常の矩形に対してこれを行ってきましたが、この形状は基本的な矩形ではありません(形状を見るにはHEREをクリックしてください)。

図形はGraphics2DでBufferedImageとして描画されています。

は助けを事前にありがとうございます!gyaが

+0

多分これが役立ちます:[スタックオーバーフロー:?ポイントは2Dの凸多角形の内側にあるかどうかを判断する方法](http://stackoverflow.com/questions/8721406/how-to-determine- a-point-in-a-2d-convex-ポリゴンの場合) –

+0

ボタンのポイントはどのようにしたらわかりますか? – CameronOfoluwa

答えて

0

あなたのポリゴンをマップアウトし、MouseListenerを追加することによって、選択された1把握することができます。次回に再描画すると、その選択を表示できます。イベントのポイントを使用してポリゴン内に含まれている場合は、確認することができ

[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を使用できます。オブジェクトの境界内にある場合は、コマンドを実行します。勾配は一貫しているので、数式を考え出すことができます。 –