Java SWT中的鼠标事件
我定义了一个节点类扩展Canvas类并处理鼠标事件Java SWT中的鼠标事件,java,events,swt,composite,java-canvas,Java,Events,Swt,Composite,Java Canvas,我定义了一个节点类扩展Canvas类并处理鼠标事件 public class Node extends Canvas { String name; public String getName() { return name; } public Node(Composite parent, int style, String name) { super(parent, style); // TODO Auto-generated constructor stub th
public class Node extends Canvas {
String name;
public String getName() { return name; }
public Node(Composite parent, int style, String name) {
super(parent, style);
// TODO Auto-generated constructor stub
this.name = name;
this.setBackground(new Color(Display.getCurrent(), 0, 0, 0));
this.addMouseListener(new MouseListener() {
@Override
public void mouseUp(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Mouse up (" + arg0.x + ", " + arg0.y + ") at node " + getName());
}
@Override
public void mouseDown(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Mouse down (" + arg0.x + ", " + arg0.y + ") at node " + getName());
}
@Override
public void mouseDoubleClick(MouseEvent arg0) {
System.out.println("Double click at node " + getName());
}
});
}
然后我创建了一个复合对象并添加了两个节点对象:
Node node1 = new Node(this, SWT.NONE, "node 1");
node1.setBounds(25, 25, 50, 50);
Node node2 = new Node(this, SWT.NONE, "node 2");
node2.setBounds(35, 35, 60, 60);
node2.setBackground(new Color(Display.getCurrent(), 75, 75, 75));
请注意,我选择了节点的位置,以便它们共享一些公共区域。使用颜色区分两个节点,我发现node1
显示在顶部,而node2
显示在后面。如果我在共享区域应用鼠标事件,node1
处理事件,node2
不处理
node2
是在node1
之后添加到组合中的,因此我希望node2
将拥有特权,即如果我将鼠标事件应用到共享区域,node2
应该处理事件
如何解决此问题?正如您所看到的,可见控件(位于其他控件之上)获取鼠标事件。我认为这种行为是正确的,也是意料之中的。我想您不会问,即使
node1
位于node2
上方并绘制在上方,但仍然让node2
接收所有鼠标事件。使用标准方法可能不可能做到这一点
但是,如果您要求确保node2
出现在node1
上方并因此接收鼠标事件,则可以反转创建顺序,或者使用如下方法:
Node node1=新节点(这个,SWT.NONE,“节点1”);
节点1.后退(25,25,50,50);
Node node2=新节点(这个,SWT.NONE,“节点2”);
节点2.挫折(35,35,60,60);
node2.setBackground(新颜色(Display.getCurrent(),75,75,75));
//使用MoveOver(null)将节点2移动到其所有同级之上
节点2.移动到上面(节点1);
此外,当您不再需要颜色时,您必须处理颜色。使用新颜色(Display.getCurrent(),75,75,75)
创建的颜色在任何地方都不会被释放。这是内存泄漏。将它们缓存到某个地方或使用系统颜色。我为每个节点设置边界。如您所见,node1
的区域是矩形(25,25,50,50),而node 2
的区域是矩形(35,35,60,60)。它们共享一个公共区域。哦,因为它们共享一个公共区域,当我在该区域单击时,我只是想知道哪个节点将处理鼠标单击事件。在我的例子中,node1
处理事件,而我期望node2
(因为我在向合成中添加node1
之后添加了node2
)。更清楚的是,当我在公共区域单击时,我会在节点1上单击鼠标(35,36),在节点1上单击鼠标(35,36)。为什么?因为我在node1之后添加node2,所以我想要的是在节点2上鼠标向下(35,36)在节点2上鼠标向上(35,36)
。那么如何修复它呢?这是我的问题,你不应该问我为什么。我提出了一个问题,我只是在等待一个解决方案。对于“为什么它们必须重叠?”的答案,我只能回答您,这是我正在工作的项目的要求
将节点2
移动到顶部。是的,我已经在上面的评论中添加了这一点。。。你错过了:)。但谢谢你再次强调这一点。。。