当前位置: 首页 > 知识库问答 >
问题:

与JComponent和AWT MouseEvent问题的鼠标冲突

商燕七
2023-03-14

因此,我在使用继承JComponent的一个名为装饰的对象进行鼠标检测时遇到了问题,我正在使用java进行鼠标点击。awt。事件MouseEvent。

我和我的团队最好的解决方案是比较每个装饰品与鼠标的距离,如果它小于50(这是装饰品的半径),它会做些什么。

private class ME implements MouseListener {
        @Override
        public void mouseClicked(MouseEvent e) {
            for(int i = 0; i < ORNAMENT_AMOUNT; i++) {
                Ornament current = oh.getOrnament(i);

                int distance = (int)(Math.sqrt(((e.getX() - current.getX()) * (e.getX() - current.getX())) + ((e.getY() - current.getY()) * (e.getY() - current.getY()))));
                
                if(distance <= 50) {
                    System.out.println("CIRCLE CLICKED!");
                    current.reset();
                }
            }
        }

我所遇到的问题是,它根本无法正常工作。我多次点击同一个点,最终它会在其中一个装饰物上触发事件。它的随机性和混乱性。

这是装饰课

//ornament class to define the game object ornament
public class Ornament extends JComponent{
    private int xPos;
    private int yPos;
    private int velocity;
    private int screenWidth;
    private int screenHeight;

    private Random rand;


    public Ornament(int screenWidth, int screenHeight, int velocity) {....}

    public int getY() { return yPos; }
    public int getX() { return xPos; }

    @Override
    public void paintComponent(Graphics graphics) {

        float r = rand.nextFloat();
        float g = rand.nextFloat();
        float b = rand.nextFloat();

        super.paintComponent(graphics);
        graphics.setColor(new Color(r, g, b));
        graphics.fillOval(0, 0, 50, 50);
    }

    ....

    public void reset() {
        this.yPos = -(int)(Math.random()*500);
        this.xPos = (int)(Math.random()*screenWidth);
        this.velocity += 1;
        update();
    }
}

我的整个方法可能是错误的,但它似乎在我的头脑中,所以帮助将不胜感激!:)

*注意:oh是我创建的一个objecthandler类,用于在具有一系列装饰的不同线程中运行游戏循环

public class ObjectHandler implements Runnable {

    private int size; 
    private Ornament[] list;

    private GUI game;

    public ObjectHandler(int size, GUI game) {
        ....
        list = new Ornament[size];

        //init object list
        for(int i = 0; i < size; i++) {
            list[i] = new Ornament(game.getFrameX(), game.getFrameY(), game.getStartingVel());
            game.add(list[i]);
        }
    }

    public Ornament getOrnament(int index) { return list[index]; }

    public void run() {
        while(true) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) { e.printStackTrace(); }

            game.loadBackground();
            for(int i = 0; i < size; i++) {

                if(list[i].getY() >= game.getFrameY())
                    list[i].reset();
                else
                    list[i].update();
            }
        }
    }
}

共有1个答案

仲孙诚
2023-03-14

谢谢大家的帮助!我使用了吉尔伯特·勒布朗的方法来实现这一点。

我从装饰类中删除了JComponent,而是创建了一个继承JPanel的类

ublic class GamePanel extends JPanel{
    
    private Ornament[] objectList;
    ......
    public GamePanel(GUI game) {
        ....
        MouseListener ml = new MouseListener();
        addMouseListener(ml);
        this.setBounds(0, 0, 500, 500);
    }

然后,我添加了一个绘制组件,并使用for循环渲染objectList数组中的每个装饰

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            .....
            for(int i = 0; i < objectList.length; i++) {
                Color c = new Color(objectList[i].r, objectList[i].g, objectList[i].b);
                g2.setColor(c);
                g2.fillOval(objectList[i].getX(), objectList[i].getY(), 50, 50);
            }
        }
    }

此外,我还将mouselistener添加到JPanel组件中。使用相同的技术进行鼠标到对象的碰撞,效果很好!

class MouseListener extends MouseAdapter
    {
        @Override
        public void mousePressed(MouseEvent e)
        {
            if(!gameOver) {
                for(int i = 0; i < objectList.length; i++) {
                    int distance = (int)(Math.sqrt(((e.getX() - objectList[i].getX()) * (e.getX() - objectList[i].getX())) + ((e.getY() - objectList[i].getY()) * (e.getY() - objectList[i].getY()))));
                    
                    if(distance <= 50) {
                        game.incScore();
                        objectList[i].reset();
                    }
                }
            ...
        }
    }

向赫芬塔内斯和吉尔伯特·勒布朗克大声呼救!:)

 类似资料:
  • 问题内容: 有2个课程- 我试图在侦听器上设置鼠标单击,但是当我运行它然后按鼠标单击时,没有任何反应。 如何使其工作? 问题答案: 为了在框架上获得鼠标点击,您还需要添加到的框架列表中。创建后尝试添加以下行:

  • 问题内容: 我有一个子类,正在使用它在屏幕上绘制形状。在构造函数中,我试图将和的 X 和 Y 大小值设置为一半,并且我认为做错了。我已经对此进行了很多查找,但找不到补救措施。代码如下。请记住,这是我第一次真正的Swing / Graphics2D创业。 问题答案: 覆盖您以返回您的首选大小,并从其宽度和高度的一半开始。为此,它在中调用。 附录:通过解释,当前的方法失败,因为从结果和是 无效的 ,直

  • Postgres 10和11的插入说明: 关于冲突[冲突目标]冲突行动 我有一张桌子: 而我想做的 但是我得到一个错误: ON CONFLICT DO UPDATE需要推理规范或约束名称提示:例如,ON CONFLICT(column_name) 为什么我必须提供一个确定的目标?如何提供主键或其他列集?

  • 现在这种情况仍然发生,但很少发生,就像100次碰撞中有1次发生,而在100次碰撞中有20次发生之前

  • 本文向大家介绍解决IDEA鼠标点击光标变大问题,包括了解决IDEA鼠标点击光标变大问题的使用技巧和注意事项,需要的朋友参考一下 这一定是困扰刚开始使用idea工具同学的一个大问题。 三种情况会导致这种问题出现。 1、你不小心按了键盘上的insert按键 解决: 再按一次吧 2、你idea上面装了vim插件,会产生冲突的 解决: 赶紧卸载了 3、你setting里面设置的 解决: 看下图,去掉勾 补

  • 本文向大家介绍详解django模板与vue.js冲突问题,包括了详解django模板与vue.js冲突问题的使用技巧和注意事项,需要的朋友参考一下 问题: django模板与vue.js的变量都是使用“{{”和“}}”包裹起来的,在渲染django模板时会先替代掉所有的“{{”和“}}”及被包裹在其中的内容,使得vue.js没有使用”{{“、”}}”来绑定变量。 处理方法: 方法1:修改vue.j