【发布时间】:2019-03-14 14:49:41
【问题描述】:
如果在 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() 方法中,但这实际上并不是我想要的。该对话框应立即出现。我还能做什么?
【问题讨论】:
-
很奇怪...你能把你的逻辑移到关闭对话框事件中吗?
-
您是否尝试在
mouseDown方法中使用e.doit = false来“使用”该事件?另一种解决方法可能是打开使用Display::asyncExec延迟的对话框,这可能使鼠标向上事件有机会到达样式文本小部件。 -
@RüdigerHerrmann e 是一个 MouseEvent 并且没有
doit。在实例化 MouseEvent (MouseUp) 之前设置event.doit=false无效。使用 asyncExec 也不是解决方案。我尝试了以下方法:myStyledText.getShell().getDisplay().asyncExec(() -> { int returnCode = dialog.open();... } -
@navy1978 不知道该怎么做。该代码将 StyledText 的部分文本替换为对话框中输入的内容。我无法在对话框中执行此操作。
-
您可以尝试编写自己的对话框:vogella.com/tutorials/EclipseDialogs/article.html