【问题标题】:MouseMotionListener not Firing correctly in JavaMouseMotionListener 在 Java 中未正确触发
【发布时间】:2012-04-12 02:32:11
【问题描述】:

谁能告诉我为什么 mouseMotionListener 没有触发 mouseDragged 事件(我已经用谷歌搜索了几个小时,甚至从网上复制并粘贴了代码!)下面是类的代码 - 我创建了一个类的对象并将其添加到名为 canvas 的 JPanel 中。

PS mousePressed() 是唯一被触发的方法,mouseDragged() 和 mouseReleased(),它们不会。

class MouseActions extends MouseInputAdapter 
{
        @Override
        public void mousePressed(MouseEvent e) 
        {
            super.mousePressed(e);//245 220
            java.awt.Point Pos = e.getPoint();
            System.out.println("at Mouse Pressed, Again");
            if(e.getButton() == MouseEvent.BUTTON3)
            {
                if(ArrayOfShapes == null)
                    return;

                for(int i = 0; i < ArrayOfShapes.length; i++)
                {
                    if(hasEntered(ArrayOfShapes[i], Pos))
                    {
                        removeAtIndex(i);
                        return;
                    }
                }
            }
        }

        @Override
        public void mouseDragged(MouseEvent e) 
        {
           System.out.println("at Mouse Dragged");
            int MovableIndex = -1;
            java.awt.Point Pos = e.getPoint();

            if(e.getButton() == MouseEvent.BUTTON1)
            {
                bDragged = true;

                while(bDragged)
                {
                    for(int i = 0; i < ArrayOfShapes.length; i++)
                    {
                        if(hasEntered(ArrayOfShapes[i], Pos))
                        {
                            MovableIndex = i;
                            break;
                        }
                    }
                    ArrayOfShapes[MovableIndex].setX(e.getX());
                    ArrayOfShapes[MovableIndex].setY(e.getY());
                    thisCurrentWindow.repaint();
                }
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) 
        {
            System.out.println("at Mouse Release");
            bDragged = false;
        }

    }

/// 现在是添加监听器的代码

MouseActions MA = new MouseActions();
canvas.addMouseListener(MA);
canvas.addMouseMotionListener(MA);

再次感谢~

M

PS....对于所有怀疑我疯狂的继承技能的人

import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;


public class CustomJPanel extends JPanel
{
    class MouseActions extends MouseInputAdapter
    {

        @Override
        public void mousePressed(MouseEvent e) 
        {
            super.mousePressed(e);
            System.out.println("Pressed");
        }

        @Override
        public void mouseDragged(MouseEvent e) 
        {
            super.mouseDragged(e);
            System.out.println("Dragged");
        }

        @Override
        public void mouseReleased(MouseEvent e) 
        {
            super.mouseReleased(e);
            System.out.println("Released");
        }
    }

    /**
     * @param args the command line arguments
     */

    private CustomJPanel()
    {
        MouseActions ma = new MouseActions();
        addMouseListener(ma);
        addMouseMotionListener(ma);
    }

    public static void main(String[] args) 
    {
        // TODO code application logic here
        JFrame frame = new JFrame();
        CustomJPanel cP = new CustomJPanel();

        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cP.setSize(500, 500);
        frame.add(cP);
        frame.setVisible(true);
    }
}

再次,当我将它分配给画布时,它永远不会触发释放或拖动

M

【问题讨论】:

  • 如果你能发布一个小型的可编译和可运行程序来演示你的问题,SSCCE,那就更好了。
  • 您的while (dragged) 看起来可能会踩到 Swing 事件线程。我强烈建议你摆脱这样的代码。
  • 现在不确定这是否正确,您为什么将两个单独的 MouseListener 放在一起 1) MouseListener,2) MouseMotionListener,使用 SSCCE 编辑您的问题,
  • @Markus:你是怎么让它工作的?通过摆脱while (dragged) 循环?
  • 哦,废话 - 它不起作用!我将while更改为if,但由于某种原因-在我的自定义JPANEL中运行它不会触发发布或拖动但是如果我从JPANEL创建一个新的类然后添加简单的事件,如输出然后它可以工作....如果我再次将其复制到画布的类(ShapePanel)然后它不起作用

标签: java swing mouseevent


【解决方案1】:

while(bDragged) 循环看起来像一个无限循环

【讨论】:

    【解决方案2】:

    据我所知,您需要实现鼠标侦听器。参考:http://profs.etsmtl.ca/mmcguffin/learn/java/04-mouseInput/

    【讨论】:

    • 这应该是评论而不是答案,因为它只是一个链接,并没有解释为什么 OP 的代码不起作用。
    • 我的错...但我上面的用户也发布了它。 :) 只要您的问题得到解答。但是解释是如果你注册了一个监听器,它也需要实现监听器。
    【解决方案3】:

    够吓人了——我按照它的编码方式工作……除了后来在代码中我删除了画布并重新创建它——但忘记重新分配 MIA。

    感谢大家的帮助,

    M

    【讨论】:

      【解决方案4】:

      我会这样做:

      class MouseActions implements MouseMotionListener, MouseListener
      {
      ..
      ..
      }
      
      canvas.addMouseListener(new MouseActions ());
      canvas.addMouseMotionListener(new MouseActions() );
      

      这可能会奏效。

      【讨论】:

      • 既然 MouseInputAdapter 已经实现了这两个接口(以及更多),为什么这会有帮助?
      • 我不知道它为什么有帮助,但它完全有效。也许为什么这有效是另一个要问的问题。所以走这条路:stackoverflow.com/questions/ask
      • 我的意思是,你的回答对原发帖者没有帮助,解决他的问题的可能性为 0%。
      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多