All*_*nde 5 java swing drag-and-drop
我的一个JComponent人正在mouseDragged大力发动一个事件.当用户尝试单击时,即使鼠标仅移动了1个像素,它也会将其解释为拖动.
如何为特定组件添加规则:
除非鼠标从按下的位置移动了10个像素,否则不要将其视为拖动事件.
注意:我知道这不是我操作系统中的系统设置,因为只有该组件上的事件会受到这种过度敏感的影响.
谢谢.
以前的答案结合在一起,具有适当的事件类型:
public class DragInsensitiveMouseClickListener implements MouseInputListener {
protected static final int MAX_CLICK_DISTANCE = 15;
private final MouseInputListener target;
public MouseEvent pressed;
public DragInsensitiveMouseClickListener(MouseInputListener target) {
this.target = target;
}
@Override
public final void mousePressed(MouseEvent e) {
pressed = e;
target.mousePressed(e);
}
private int getDragDistance(MouseEvent e) {
int distance = 0;
distance += Math.abs(pressed.getXOnScreen() - e.getXOnScreen());
distance += Math.abs(pressed.getYOnScreen() - e.getYOnScreen());
return distance;
}
@Override
public final void mouseReleased(MouseEvent e) {
target.mouseReleased(e);
if (pressed != null) {
if (getDragDistance(e) < MAX_CLICK_DISTANCE) {
MouseEvent clickEvent = new MouseEvent((Component) pressed.getSource(),
MouseEvent.MOUSE_CLICKED, e.getWhen(), pressed.getModifiers(),
pressed.getX(), pressed.getY(), pressed.getXOnScreen(), pressed.getYOnScreen(),
pressed.getClickCount(), pressed.isPopupTrigger(), pressed.getButton());
target.mouseClicked(clickEvent);
}
pressed = null;
}
}
@Override
public void mouseClicked(MouseEvent e) {
//do nothing, handled by pressed/released handlers
}
@Override
public void mouseEntered(MouseEvent e) {
target.mouseEntered(e);
}
@Override
public void mouseExited(MouseEvent e) {
target.mouseExited(e);
}
@Override
public void mouseDragged(MouseEvent e) {
if (pressed != null) {
if (getDragDistance(e) < MAX_CLICK_DISTANCE) return; //do not trigger drag yet (distance is in "click" perimeter
pressed = null;
}
target.mouseDragged(e);
}
@Override
public void mouseMoved(MouseEvent e) {
target.mouseMoved(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我以前就必须这样做。这是我的鼠标事件处理代码,缩减为仅与使拖动在被视为拖动之前需要几个像素相关的位。
public void mousePressed(int mod, Point loc) {
pressLocation=copyLocation(loc,pressLocation);
dragLocation=null;
}
public void mouseReleased(int mod, Point loc) {
if(pressLocation!=null && dragLocation!=null) {
// Mouse drag reverted to mouse click - not dragged far enough
// action for click
pressLocation=null;
}
else if(dragLocation!=null) {
// action for drag completed
}
else {
// do nothing
}
pressLocation=null;
dragLocation=null;
}
public void mouseDragged(int mod, Point loc) {
if(pressLocation!=null) { // initial drag actions following mouse press
dragLocation=pressLocation; // consider dragging to be from start point
if(Math.abs(loc.x-pressLocation.x)<dragMinimum && Math.abs(loc.y-pressLocation.y)<dragMinimum) {
return; // not dragged far enough to count as drag (yet)
}
// action drag from press location
pressLocation=null;
}
else {
// action drag from last drag location
dragLocation=copyLocation(loc,dragLocation);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我还遇到了Java一些 JVM 在拖动后生成点击事件的问题,我必须检测并抑制这些事件。
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |