Java SWT: mouseUp () не запускается при открытии диалога в mousDown () - PullRequest
2 голосов
/ 14 марта 2019

Моя программа открывает диалоговое окно, если в StyledText щелкнуть определенную строку. Поэтому в mouseDown () я сначала хочу проверить, на что нажали, а затем открыть диалоговое окно. Это работает. После закрытия диалога mouseUp () не вызывается. Это приводит к выделению текста при перемещении курсора, как будто пользователь пытается выделить текст. Я могу воспроизвести поведение, выполнив следующие задачи:

  • Нажмите на строку в StyledText -> Диалог открывается
  • Закрыть диалог
  • Переместите мышку без нажатия -> Текст помечается как выбранный

В моем случае мне не нужно запускать mouseUp (). Но если он не запущен, ОС предполагает, что кнопка мыши все еще нажата, и выбирает текст. Это может быть правильным поведением, если диалог открывается и крадет фокус. Но тогда должна быть возможность сообщить системе, что кнопка мыши отпущена.

myStlyedText.addMouseListener(new MouseListener() {
    @Override
    public void mouseUp(MouseEvent e) {
        System.out.println("MouseUp is fired");
    }

    @Override
    public void mouseDown(MouseEvent e) {
        if (certainStringClicked()) {
            openDialog();
        }
    }

    @Override
    public void mouseDoubleClick(MouseEvent e) {}
});

Я могу убедиться, что mouseUp () не вызывается, потому что «MousUp запущен» не печатается на консоли.

Какой лучший способ справиться с этим? Я уже пытался установить фокус на другой виджет (setFocus () и forceFocus ()), но это не помогло.

Я пытался вызвать mouseUp самостоятельно:

Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);

Это приводит к сообщению «MousUp запущен», но проблема выбора все еще существует.

Я мог бы переместить код в метод mouseUp (), но на самом деле это не то, что я хочу. Диалог должен появиться сразу. Что еще я могу сделать?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Попробуйте добавить myStlyedText.notifyListeners(SWT.MouseUp, null); к вашему коду. Он должен работать.

myStlyedText.addMouseListener(new MouseListener() {
    @Override
    public void mouseUp(MouseEvent e) {
        System.out.println("MouseUp is fired");
    }

    @Override
    public void mouseDown(MouseEvent e) {
        if (certainStringClicked()) {
            myStlyedText.notifyListeners( SWT.MouseUp, null );
            openDialog();
        }
    }

    @Override
    public void mouseDoubleClick(MouseEvent e) {}
});
1 голос
/ 15 марта 2019

Это не хорошее решение .Но для некоторых это может быть обходной путь.

Можно добавить SWT.MODELESS к стилю оболочки в конструкторе Dialog, который расширяет jface.dialog.Dialog.

setShellStyle(SWT.MODELESS);

MouseUp() get теперь запущен.

Проблема здесь в том, что можно открыть много диалогов, нажав на текст, хотя один диалог уже открыт.

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