Моя программа открывает диалоговое окно, если в 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 (), но на самом деле это не то, что я хочу. Диалог должен появиться сразу. Что еще я могу сделать?