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