【发布时间】: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