Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:在源组件外部释放鼠标时结束鼠标标记_Java_Swing_Drag And Drop_Release_Mouseevent - Fatal编程技术网

java:在源组件外部释放鼠标时结束鼠标标记

java:在源组件外部释放鼠标时结束鼠标标记,java,swing,drag-and-drop,release,mouseevent,Java,Swing,Drag And Drop,Release,Mouseevent,我们目前正在为一个必须在下周完成的项目进行修复,所以我们的时间有点不够了(别担心,我想说的是,我们没有时间扔掉所有代码,重新开始……) 我们有一个JPanel(=“页面”),上面有一堆其他JPanel(充当图形的节点)。用户可以通过单击要连接的第一个节点,然后单击第二个节点,或者通过从一个节点拖到另一个节点来连接节点。 但最后一个并没有像我们预期的那样起作用: 如果我们将连接线拖出其启动的节点(例如,拖到页面或任何其他节点),则用于创建该线的mouseDragged事件不会以mousererel

我们目前正在为一个必须在下周完成的项目进行修复,所以我们的时间有点不够了(别担心,我想说的是,我们没有时间扔掉所有代码,重新开始……)

我们有一个
JPanel
(=“页面”),上面有一堆其他
JPanel
(充当图形的节点)。用户可以通过单击要连接的第一个节点,然后单击第二个节点,或者通过从一个节点拖到另一个节点来连接节点。 但最后一个并没有像我们预期的那样起作用:

如果我们将连接线拖出其启动的节点(例如,拖到页面或任何其他节点),则用于创建该线的
mouseDragged
事件不会以
mousererelease
结束。如果我将鼠标放在开始拖动的节点上,效果会很好,但我无法创建与该节点的任何连接

为了能够绘制到页面的连接,我们正在调度事件,直到它们到达将处理它们的页面

有趣的是:一切都正常,除了这样一个事实:如果我们放置一个
System.out.println(“鼠标拖动”),就会有一个无尽的“鼠标拖动”输出链
mouseDragged()的代码中
。 将自身连接到

因此,我的问题是:如果
mouseDragged
事件发生在
mouseDragged
最初启动的组件之外,如何结束
mouseDragged
事件? 是否有方法中止
mouseDragged
事件

是否可能/有必要“伪造”中断
mousererelease
事件

希望有一个解决方案,不会使煮更多的咖啡

您好, 弗洛

编辑: 好的,给你一些代码:

由节点和页面实现的接口使事情变得更简单:

import java.awt.event.MouseEvent;

/**
 * Interface which can be used together with MouseEventListenerAdapter to
 * easily receive mouse events.
 *
 * @author flo
 */
public interface MouseEventsInterface {
    /**
     * Called when a mouse clicked event is received.
     *
     * @param e Triggered mouse event.
     */
    void onMouseClicked(MouseEvent e);
    /**
     * Called when a mouse dragged event is received.
     *
     * @param e Triggered mouse event.
     */
    void onMouseDragged(MouseEvent e);
    [and so on...]
    /**
     * Called when a mouse released event is received.
     *
     * @param e Triggered mouse event.
     */
    void onMouseReleased(MouseEvent e);
}
事件的适配器

/**
 * Class which forwards mouse events to a MouseEventsInterface which have
 * originally been targeted to a MouseInputAdapter.
 *
 * @author flo
 *
 * @param <M> The interface to which events are sent.
 */
public class MouseEventListenerAdapter<M extends MouseEventsInterface> extends MouseInputAdapter {
    /**
     * Interface which receives the events which are forwarded by this class.
     */
    private M mei;

    /**
     * Creates an adapter which forwards all events to the MouseEventsInterface.
     *
     * @param mei The receiver of the forwarded events.
     */
    public MouseEventListenerAdapter(final M mei) {
        this.mei = mei;
    }

    @Override
    public final void mousePressed(final MouseEvent e) {
        this.mei.onMousePressed(e);
    }
    @Override
    public final void mouseClicked(final MouseEvent e) {
        this.mei.onMouseClicked(e);
    }
    @Override
    public final void mouseDragged(final MouseEvent e) {
        this.mei.onMouseDragged(e);
    }
    @Override
    public final void mouseMoved(final MouseEvent e) {
        this.mei.onMouseMoved(e);
    }
    @Override
    public final void mouseReleased(final MouseEvent e) {
        this.mei.onMouseReleased(e);
    }

    /**
     * Returns the receiver of the forwarded {@link MouseEvent MouseEvents}.
     * @return the receiver of the forwarded {@link MouseEvent MouseEvents}.
     */
    protected final M getEventReceiver() {
        return this.mei;
    }
}
页面的部分代码:

@Override
public final void onMouseDragged(final MouseEvent e) {
    System.out.println("Mouse: dragged");
    if (isDragGestureActive) {
        if (helperConnection != null && e instanceof NodeConnectorMouseEvent) {
            NodeConnectorMouseEvent evt = (NodeConnectorMouseEvent) e;
            if (containsIoPort(evt) != null && weAreDragging) {
                Point absPosition = calcAbsolutePosition(evt);

                // Discard drag events that would jump farther than 15 pixels,
                //but only if we actually weren't dragging
                if (weAreDragging
                        && (Math.abs(absPosition.x - lastDragPosition.x) < 15
                                && Math.abs(absPosition.y - lastDragPosition.y) < 15)) {
                    updateHelperConnection(absPosition);
                }

                lastDragPosition = absPosition;
            }
        } else if (e.getSource() instanceof EditorNode) {
            moveSelectedNodes((EditorNode) e.getSource(), e.getX() - grabPosition.x, e.getY() - grabPosition.y);
        } else {
            return;
        }
    } else {
        return;
    }
}
@Override
public final void onMouseReleased(final MouseEvent e) {
    System.out.println("Mouse: released");
    if (e instanceof NodeConnectorMouseEvent) {
        NodeConnectorMouseEvent evt = (NodeConnectorMouseEvent) e;
        IOPort port = containsIoPort(evt);
        if (port != null) {
            weAreDragging = false;
            lastDragPosition = new Point(0, 0);
            onPortSelected(port);
        }
    } else if (e.getSource() instanceof EditorNode) {
        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    } else {
        finishHelperConnection(null);
    }
    isDragGestureActive = false;
}
@覆盖
鼠标拖动时的公共最终无效(最终鼠标事件e){
System.out.println(“鼠标:拖动”);
如果(isDragGestureActive){
if(helperConnection!=null&&e NodeConnectorMouseEvent实例){
NodeConnectorMouseEvent evt=(NodeConnectorMouseEvent)e;
if(containsIoPort(evt)!=null和磨损标记(&W){
点绝对位置=距绝对位置(evt);
//放弃将跳转超过15像素的拖动事件,
//但除非我们真的不拖拉
如果(佩戴标签)
&&(数学abs(absPosition.x-lastDragPosition.x)<15
&&Math.abs(Abposition.y-lastDragPosition.y)<15)){
更新帮助连接(absPosition);
}
lastDragPosition=absPosition;
}
}else if(例如,EditorNode的getSource()实例){
moveSelectedNodes((EditorNode)e.getSource(),e.getX()-grabPosition.x,e.getY()-grabPosition.y);
}否则{
返回;
}
}否则{
返回;
}
}
@凌驾
在MouseEvent e发布时公开最终作废(最终MouseEvent e){
System.out.println(“鼠标:释放”);
if(NodeConnectorMouseEvent的实例){
NodeConnectorMouseEvent evt=(NodeConnectorMouseEvent)e;
IOPort端口=containsIoPort(evt);
如果(端口!=null){
佩戴标签=错误;
lastDragPosition=新点(0,0);
onPortSelected(端口);
}
}else if(例如,EditorNode的getSource()实例){
setCursor(新游标(Cursor.DEFAULT_Cursor));
}否则{
finishHelperConnection(空);
}
isDragGestureActive=false;
}
还有很多,但我想这是有趣的部分。
谢谢你的帮助

我想知道的一些事情: 1.在页面的代码中,lastDragPosition=新点(0,0);为什么?
2.为什么不使用mouseExited(MouseEvent e)方法来模拟拖动中断,运行一个线程来检查是否已拖动,如果已完成拖动,则连接点

我不确定是否理解您的方法,但想到两件事:

  • 您可以创建一个“事件”,这样它就不会被发起它的源以默认方式处理

  • 您可以
    push()。这里有一个相关的例子,是一个很好的指南

附录:虽然不适用于眼前的问题,但有其他方法可以选择多个节点:

  • 使用鼠标拖动或按住shift键单击进行多项选择,并使用鼠标右键单击查看关联菜单

  • 使用shift键单击进行多项选择
    com.mxgraph.examples.swing.GraphEditor
    就是一个例子

  • 这表明如何使用
    JInternalFrame


据我所知,当执行拖动时,
MouseEvent
s不再分派给侦听器。相反,您可以使用
DragSourceListener
,它有几个有用的方法。您感兴趣的可能是
dragDropEnd
,它在拖动操作结束时调用,无论成功与否。

它应该按预期结束,而不需要特殊代码。您确定正在处理MouseMotionListener和MouseListener事件吗?如果没有代码,很难多说……如果允许的话,你可以考虑用JLead(JDK7)或JXLayer(JDK6)来装饰节点的父节点——VUE将在自定义LayerUI中实现所有鼠标跟踪和线条绘制,这将大大简化您的逻辑。1:在拖动过程结束时,我们只是在设置一些变量。我们正在从起点显示一条线
@Override
public final void onMouseDragged(final MouseEvent e) {
    System.out.println("Mouse: dragged");
    if (isDragGestureActive) {
        if (helperConnection != null && e instanceof NodeConnectorMouseEvent) {
            NodeConnectorMouseEvent evt = (NodeConnectorMouseEvent) e;
            if (containsIoPort(evt) != null && weAreDragging) {
                Point absPosition = calcAbsolutePosition(evt);

                // Discard drag events that would jump farther than 15 pixels,
                //but only if we actually weren't dragging
                if (weAreDragging
                        && (Math.abs(absPosition.x - lastDragPosition.x) < 15
                                && Math.abs(absPosition.y - lastDragPosition.y) < 15)) {
                    updateHelperConnection(absPosition);
                }

                lastDragPosition = absPosition;
            }
        } else if (e.getSource() instanceof EditorNode) {
            moveSelectedNodes((EditorNode) e.getSource(), e.getX() - grabPosition.x, e.getY() - grabPosition.y);
        } else {
            return;
        }
    } else {
        return;
    }
}
@Override
public final void onMouseReleased(final MouseEvent e) {
    System.out.println("Mouse: released");
    if (e instanceof NodeConnectorMouseEvent) {
        NodeConnectorMouseEvent evt = (NodeConnectorMouseEvent) e;
        IOPort port = containsIoPort(evt);
        if (port != null) {
            weAreDragging = false;
            lastDragPosition = new Point(0, 0);
            onPortSelected(port);
        }
    } else if (e.getSource() instanceof EditorNode) {
        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    } else {
        finishHelperConnection(null);
    }
    isDragGestureActive = false;
}