MouseListener MouseDragged无法按预期工作

时间:2012-01-28 02:08:23

标签: java swing mouselistener

当我左键单击,按住并将光标移动到它们上时,我有一个网格,其中框变为红色(我基本上想要绘制网格)(即:拖动鼠标)。我有下面的代码。当我拖动鼠标时。 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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

你需要这样的东西

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);
  }

答案 1 :(得分:0)

我认为你的问题源于你将鼠标拖到多个JPanels上,以及java识别拖动的方式。 Java通过以下算法识别拖动:

在单个组件“c”中:

  1. 在“c”
  2. 内按下鼠标
  3. 然后鼠标在“c”内移动 - 这构成了在“c”
  4. 内的拖动

    因为您的鼠标最终会离开一个组件并在按下时输入第二个组件,所以第二个组件永远不会注册mousePressed操作,因此它不会认为您正在拖动鼠标。我建议在任何“实验室”JPanels(mousePressed())中按下鼠标时保持一些告诉GridPane的标志,然后实现mouseMoved()方法以检查标志和颜色(如果已设置)。然后实现mouseReleased()将标志重置回正常状态,这样在停止拖动后就不会继续着色。

    有关Java中鼠标移动的更多信息,请查看以下链接:   http://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html