Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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 SWT中的鼠标事件_Java_Events_Swt_Composite_Java Canvas - Fatal编程技术网

Java SWT中的鼠标事件

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

我定义了一个节点类扩展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

    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
移动到顶部。是的,我已经在上面的评论中添加了这一点。。。你错过了:)。但谢谢你再次强调这一点。。。