激活JLayeredPane.DRAG_LAYER后,只有鼠标按下才能执行 - 不会拖动和释放

时间:2015-03-19 20:11:19

标签: java drag-and-drop mouseevent mouselistener jlayeredpane

我是JLayeredPane的新手,所以我认为部分归咎于为什么我无法理解 为什么鼠标按下/拖动/释放方法不能像我拖动时那样执行 一个txtUser项目(附有听众;见底部)。

使用给定的代码段。我拖动时只执行userMousePressed

然而, IF 注释掉了行layeredPane.add(userDragLetter, LayeredPane.DRAG_LAYER),所有3个鼠标事件都被识别并正确执行。

  private void userMousePressed(MouseEvent e){

    curUserCell.index = interpIndex(e.getXOnScreen(),ulcUser.x,txtUser[0].getWidth());

    curUserCell.background = txtUser[curUserCell.index].getBackground();

    curUserCell.content = txtUser[curUserCell.index].getText().charAt(0);

    txtUser[curUserCell.index].setBackground(B_DRAGGING);   

    txtUser[curUserCell.index].setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

    int w = Integer.parseInt(e.getComponent().getName());

    userDragLetter = null; 

    Component c = txtUser[w];                            

    parentLocation = c.getParent().getLocation();                                         
    xAdjustment = parentLocation.x - e.getX();                                            
    yAdjustment = parentLocation.y - e.getY()- gamePanel.getHeight();

    userDragLetter = (JLabel)c;                                                           
    userDragLetter.setPreferredSize(new Dimension(CELLSIZE, CELLSIZE));
    userDragLetter.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);           

//////////////////////////////////////////////////////////////////////////////////////                                                                                          
// If I comment out the line below, `userMouseDragged` & `userMouseReleased` DO execute

    layeredPane.add(userDragLetter, JLayeredPane.DRAG_LAYER);
///////////////////////////////////////////////////////////////////////////////////// 

  }

此方法无法使用以上代码执行,并且':

private void userMouseDragged(MouseEvent me) {  

    System.out.print("User mouse dragged entered..."); // Doesn't print

    ...
}

此方法无法执行:

private void userMouseReleased(MouseEvent e)
{
    System.out.println("User mouse released entered..."); // Doesn't print
    ...
}    

以下是我如何分配鼠标监听器:

  txtUser[k].addMouseMotionListener
  (
       new MouseMotionAdapter() 
      {
        public void mouseDragged(MouseEvent evt) 
        {
          userMouseDragged(evt);
        }
      }
   );

  txtUser[k].addMouseListener
  (
    new MouseAdapter() 
    {
      public void mousePressed(MouseEvent e) 
      {   
        userMousePressed(e);
      }

      public void mouseReleased(MouseEvent e) 
      {                                         //after dragging user letter
              userMouseReleased(e);
      }
    }
  ); 

(我试图做的是物理拖动 - 即,鼠标指针字面指向 - 来自txtUser[...]的一个字母,因为它被拖到游戏网格中。我和#39; m不接近,但是它已经坏了!如果我注释掉layeredPane行,程序将一如既往地工作。)

(a)为什么拖动鼠标并忽略鼠标释放事件?

(b)如何使拖拽和释放的事件触发他们的方法?

0 个答案:

没有答案