如果在StyledText中单击某个字符串,我的程序将打开一个对话框。因此,在mouseDown()中,我首先要检查已单击的内容,然后打开一个对话框。这可行。关闭对话框后,不会调用mouseUp()。这将导致在移动光标时选择文本,就像用户尝试选择文本一样。 我可以通过执行以下任务来重现该行为:
在我的用例中,不需要触发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()方法中,但这实际上并不是我想要的。该对话框应立即出现。我还能做什么?
答案 0 :(得分:2)
尝试将Mode 1
添加到您的代码中。
它应该工作。
myStlyedText.notifyListeners(SWT.MouseUp, null);
答案 1 :(得分:1)
这不是一个好的解决方案。但这对于某些人来说可能是一种解决方法。
可以在对话框的构造函数中向外壳样式添加SWT.MODELESS
,该对话框扩展了jface.dialog.Dialog
。
setShellStyle(SWT.MODELESS);
MouseUp()立即被触发。
这里的问题是,尽管一个对话框已经打开,但仍可以通过单击文本来打开许多对话框。