1

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 オブジェクトを作成し、2 つの 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));

いくつかの共通領域を共有するようにノードの位置を選択したことに注意してください。色を使って 2 つのノードを区別するとnode1、 が上に表示され、node2が後ろに表示されていることがわかりました。共有領域でマウス イベントを適用するnode1と、イベントを処理し、処理node2しません。

node2の後にコンポジットに追加されるnode1ため、特権があると予想されnode2ます。つまり、共有領域にマウスイベントを適用するとnode2、イベントを処理する必要があります。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

ご覧のとおり、表示されている (および他のコントロールの上にある) コントロールがマウス イベントを取得します。この動作は正しく、期待されていると思います。node1node2に描かれているにもかかわらず、node2すべてのマウスイベントを受け取ることができます。これは、標準的な方法では不可能な場合があります。

ただし、 が確実にnode2上に表示node1されてマウス イベントを受け取るようにする場合は、作成順序を逆にするか、Control#moveAbove(Control)以下のように使用できます。

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);
于 2012-12-22T20:37:16.523 に答える