加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java AWT / Swing“包含”和“相交”方法无法正常工作

发布时间:2020-12-15 04:56:28 所属栏目:Java 来源:网络整理
导读:我试图教自己一些 Java AWT和简单的图形,但是使用contains和intersects方法有困难. 问题是它似乎从点击鼠标的位置和实际形状中检测到几个像素的碰撞. GameDemo.java package uk.co.mhayward.games.sandbox;import java.awt.BasicStroke;import java.awt.Colo
我试图教自己一些 Java AWT和简单的图形,但是使用contains和intersects方法有困难.

问题是它似乎从点击鼠标的位置和实际形状中检测到几个像素的碰撞.

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,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 vertexCount,double startAngle) {
            super(getXCoordinates(x,startAngle),getYCoordinates(x,vertexCount);
        }

        protected static int[] getXCoordinates(int x,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,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 / Jan / 12 – 更改覆盖涂料(g)到paintComponent(g) – 仍然没有正确检测到碰撞.
05 / Jan / 12 – 创建了一个SSCCE来更容易地证明问题.

解决方法

在面板上收听,而不是JFrame.您看到的偏移来自标题栏.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读