Проблема SWT с MouseTrackListener и Shell - PullRequest
1 голос
/ 11 марта 2010

Я разрабатываю плагин Eclipse, и у меня есть проблема, которая воспроизводится здесь:

    popup = new Shell(PlatformUI.getWorkbench().getDisplay(), SWT.TOOL );
    popup.setLayout(new FillLayout());
    Text text = new Text(popup, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL);
    text.setBackground(new org.eclipse.swt.graphics.Color(PlatformUI.getWorkbench().getDisplay(), 255, 255, 204));
    text.addMouseTrackListener(new MouseTrackListener() { 
       public void mouseHover(MouseEvent e) { 
       }    
       public void mouseExit(MouseEvent e) { 
          popup.dispose();   
       }    
       public void mouseEnter(MouseEvent e) { 
       } 
    });
popup.setSize(200, 100);
text.setText("The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog");
popup.open();

Как вы видите, я создаю оболочку, помещаю в нее текстовое поле и помещаю все это в оболочку. Затем я присоединяю MouseTrackListener к оболочке. События не запускаются (например, при наведении курсора в оболочке «mouseHover» не печатается и т. Д.). Когда я удаляю Textbox, события запускаются. Может кто-нибудь сказать мне, где проблема, пожалуйста? Я не хочу прикреплять слушателя к текстовому полю, а к оболочке. Я буду очень признателен за помощь, потому что я уже давно пытаюсь отследить ее.

Спасибо и всего наилучшего, Krt_Malta

Ответы [ 2 ]

1 голос
/ 14 марта 2010

Добрый человек из списка рассылки Eclipse SWT дал мне следующее решение:

text.forceFocus();
           text.addFocusListener(new FocusListener(){

                       @Override
                       public void focusGained(FocusEvent arg0) {
                               // TODO Auto-generated method stub
                       }

                       @Override
                       public void focusLost(FocusEvent arg0) {
                               // TODO Auto-generated method stub
                               shell.dispose();
                       }

           });

Это не совсем на 100% то, что я хотел (так как кажется, что то, что я хочу, не может быть легко достигнуто), но все равно это здорово. Надеюсь, это поможет любому, кто столкнется с той же проблемой.

С уважением, Krt_Malta

0 голосов
/ 24 октября 2012

У меня есть «лучшее» решение - в зависимости от ваших предпочтений.

Установите размер текста на 1 или 2 пикселя меньше по всей окружности, чем в оболочке, в которой он находится. Таким образом, оболочка обеспечивает эффект границы вокруг текста.

Установить mouseExit на оболочке.

Это даст правильное поведение - с одной ужасной проблемой. Когда мышь вводит комбинацию text + shell, mouseExit генерируется мышью, покидающей оболочку в текстовое поле.

Я установил флаг (логический mouseIn_flag), который вначале ложен. На выходе мыши установлено значение true. Если это верно для mouseExit - shell.close ();

Эффект состоит в том, что он игнорирует первый mouseExit и пропускает мышь в текст. Он выполняет закрытие оболочки, когда мышь выходит из текста (и, следовательно, входит в оболочку), а затем выходит из оболочки.

Поскольку оболочка представляет собой границу в один / два пикселя вокруг текста, пользователю придется усердно работать над странными движениями, чтобы некорректно вызывать эти события.

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