Распространение событий SWT - PullRequest
8 голосов
/ 29 августа 2011

Я пытаюсь обнаружить события щелчка на элементе управления Composite, который содержит ряд других композитов. Я попробовал:

topComposite.addMouseListener(new MouseListener() {
        ...
        @Override
        public void mouseUp(MouseEvent arg0) {
            logger.info("HERE");
        });
});

Но событие никогда не начинается. Я предположил, что когда событие мыши произошло на ребенке, оно будет распространяться вверх по цепочке, но этого не происходит. Как мне это сделать?

1 Ответ

11 голосов
/ 29 августа 2011

В SWT общее правило таково, что события не распространяются. Основным исключением из этого является распространение траверсов, что довольно сложно описать.

Простой ответ на вашу проблему заключается в том, что вы должны добавить слушателя к всем вашим детям Composite - рекурсивно !

например. как это

public void createPartControl(Composite parent) {
    // Create view...

    final MouseListener ma = new MouseAdapter() {
        @Override
        public void mouseDown(MouseEvent e) {
            System.out.println("down in " + e.widget);
        }
    };
    addMouseListener(parent, ma);
}

private void addMouseListener(Control c, MouseListener ma) {
    c.addMouseListener(ma);
    if (c instanceof Composite) {
        for (final Control cc : ((Composite) c).getChildren()) {
            addMouseListener(cc, ma);
        }
    }
}

Виджет, на который нажали, находится в e.widget, как показано выше. Важной проблемой является не забывайте делать это снова, если вы добавите еще Controls позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...