2012-01-04 84 views
3

我試圖教自己一些Java AWT和簡單的圖形,但使用contains和intersects方法時遇到了困難。Java AWT/Swing「包含」和「相交」方法無法正常工作

問題是,它似乎檢測到從單擊鼠標的位置到實際形狀的幾個像素的碰撞。

GameDemo.java

package uk.co.mhayward.games.sandbox; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 
import java.awt.Shape; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GameDemo extends JFrame { 

    GamePanel gamePanel = new GamePanel(); 

    public static void main(String[] args) { 
     new GameDemo(); 
    } 

    public GameDemo() { 
     super("click me"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.add(gamePanel); 
     this.setSize(200, 200); 

     this.setVisible(true); 
     this.addMouseListener(new MouseListener() { 
      public void mouseClicked(MouseEvent e) {} 

      public void mousePressed(MouseEvent e) { 
       System.out.println(e.getPoint().toString()); 
       if (gamePanel.shape.contains(e.getPoint())) { 
        System.out.println("IN"); 
       } else { 
        System.out.println("out"); 
       } 
      } 

      public void mouseReleased(MouseEvent e) {} 

      public void mouseEntered(MouseEvent e) {} 

      public void mouseExited(MouseEvent e) {} 
     }); 
    } 

    public class GamePanel extends JPanel { 

     Shape shape = new RegularPolygon(100, 100, 100, 6, 0); 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g; 

      g2d.setStroke(new BasicStroke(1)); 
      g2d.setPaint(Color.WHITE); 
      g2d.fill(shape); 
      g2d.setPaint(Color.BLACK); 
      g2d.draw(shape); 
     } 
    } 

    public static class RegularPolygon extends Polygon { 
     private static final long serialVersionUID = 8828151557263250246L; 

     /** 
     * @param x 
     * @param y 
     * @param r 
     * @param vertexCount 
     */ 
     public RegularPolygon(int x, int y, int r, int vertexCount) { 
      this(x, y, r, vertexCount, 0); 
     } 

     /** 
     * @param x 
     * @param y 
     * @param r 
     * @param vertexCount 
     * @param startAngle 
     *   360deg = PI 
     */ 
     public RegularPolygon(int x, int y, int r, int vertexCount, double startAngle) { 
      super(getXCoordinates(x, y, r, vertexCount, startAngle), 
        getYCoordinates(x, y, r, vertexCount, startAngle), 
        vertexCount); 
     } 

     protected static int[] getXCoordinates(int x, int y, int r, int vertexCount, double startAngle) { 
      int res[] = new int[vertexCount]; 
      double addAngle = 2 * Math.PI/vertexCount; 
      double angle = startAngle; 
      for (int i = 0; i < vertexCount; i++) { 
       res[i] = (int) Math.round(r * Math.cos(angle)) + x; 
       angle += addAngle; 
      } 
      return res; 
     } 

     protected static int[] getYCoordinates(int x, int y, int r, int vertexCount, double startAngle) { 
      int res[] = new int[vertexCount]; 
      double addAngle = 2 * Math.PI/vertexCount; 
      double angle = startAngle; 
      for (int i = 0; i < vertexCount; i++) { 
       res[i] = (int) Math.round(r * Math.sin(angle)) + y; 
       angle += addAngle; 
      } 
      return res; 
     } 
    } 
} 

EDITS

04 /月/ 12 - 改變覆蓋漆(七)的paintComponent(G) - 仍然沒有檢測到碰撞正確。 05/Jan/12 - 創建了一個SSCCE來更容易地展示問題。

回答

4

在面板上聽,而不是JFrame。您看到的偏移量來自標題欄。

+0

這個工作,非常感謝! – matthewh86 2012-01-06 10:13:14

1

你必須重寫paintComponent(圖形G)爲Swing JComponents而不是爲AWT paint方法有效(圖形g^)

+0

似乎沒有工作,它仍然有相同的行爲。 – matthewh86 2012-01-04 15:03:57