Java MouseListener MouseDraged无法按预期工作

Java MouseListener MouseDraged无法按预期工作,java,swing,mouselistener,Java,Swing,Mouselistener,我有一个网格,当我左键单击、按住并移动光标(即:拖动鼠标)时,框变为红色(我基本上想要绘制网格)。我有下面的代码。当我做鼠标拖动的时候。MouseDragged方法被正确调用,但是只有一个框变为红色,在我拖动之后什么也没有发生(尽管该方法仍然被调用)。有什么想法吗?希望我是清楚的。谢谢 public static class DragListener implements MouseMotionListener { @Override public void mouseDr

我有一个网格,当我左键单击、按住并移动光标(即:拖动鼠标)时,框变为红色(我基本上想要绘制网格)。我有下面的代码。当我做鼠标拖动的时候。MouseDragged方法被正确调用,但是只有一个框变为红色,在我拖动之后什么也没有发生(尽管该方法仍然被调用)。有什么想法吗?希望我是清楚的。谢谢

public static class DragListener implements MouseMotionListener
{



    @Override
    public void mouseDragged(MouseEvent me) {


            JPanel current =(JPanel)me.getSource();

            current.setBackground(Color.RED);

    }
  }
这是网格的定义:

public static class GridPane extends JPanel {

    public GridPane(int row, int col) {
        int count = 0 ;
        setLayout(new GridLayout(row, col));
        setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));

        for (int i = 1; i <= (row * col); i++) {

            JPanel lab = new JPanel();

            lab.setEnabled(true);
            lab.setBackground(Color.WHITE);
            lab.setPreferredSize(new Dimension(3, 3));
            lab.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            lab.addMouseMotionListener(new DragListener()); 
            lab.addMouseListener(new ClickListener());
            lab.setName(count+"");
            ++count;

            add(lab);
        }
    }
}
公共静态类GridPane扩展了JPanel{
公共网格窗格(整数行,整数列){
整数计数=0;
setLayout(新网格布局(行、列));
setBorder(BorderFactory.createEmptyByOrder(1,1,1,1));

对于(inti=1;i你需要这样的东西

public MouseMotionEventDemo() {
    addMouseMotionListener(this);
    setVisible(true);
  }

  public void mouseMoved(MouseEvent me) {
    mX = (int) me.getPoint().getX();
    mY = (int) me.getPoint().getY();
    repaint();
  }

  public void mouseDragged(MouseEvent me) {
    mouseMoved(me);
  }

我认为您的问题源于您在多个JPanel上拖动鼠标,以及java如何识别拖动。java通过以下算法识别拖动:

在单个组件“c”中:

  • 在“c”内按下鼠标
  • 然后在“c”内移动鼠标-这构成在“c”内拖动
  • 因为您的鼠标最终会离开一个组件并在按下时进入第二个组件,所以第二个组件从不注册鼠标按下的动作,因此它不会认为您在拖动鼠标。我建议您在任何“lab”JPanel中按下鼠标时,保留一些标志,告知您的GridPane(mousePressed()),然后实现mouseMoved()方法,检查是否已设置该标志和颜色。然后实现mouseRelease()将标志重置为正常状态,以便停止拖动后不再继续着色

    有关Java中鼠标运动的更多信息,请查看以下链接:

    您只需跟踪位置,然后将网格中鼠标所在的框设置为红色。我猜它只是在您单击鼠标时获取初始鼠标位置,而不是在按住鼠标左键时获取更新的鼠标位置。嗯,这是一个有效点。谢谢。有什么提示吗?即机架鼠标的位置?为了更快地获得更好的帮助,请发布一个。