SWT中的鼠标事件

时间:2012-12-22 11:18:27

标签: java events swt composite java-canvas

我定义了一个Node类扩展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());

        }
    });
}

然后我创建了一个Composite对象并添加了两个Node对象:

    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应该处理事件。

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

正如您所看到的那样,可见(并且在另一个之上)的控件会获取鼠标事件。我认为这种行为是正确和预期的。即使node1高于node2并高于node2,但我仍然认为你仍然要求node2接收所有鼠标事件。使用标准方法可能无法实现。

如果您要求确保node1出现在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)); // Use moveAbove(null) to move node2 above all its siblings node2.moveAbove(node1); 之上并因此接收鼠标事件,您可以撤销创建顺序,或者您可以使用Control#moveAbove(Control),如下所示:

{{1}}