我的程序在styledText中单击某个字符串,打开对话框。因此,在Mousedown()中,我首先想检查已单击的内容,然后打开对话框。这有效。关闭对话框后,未调用MouseUp()。这会导致在移动光标时选择文本,就好像用户尝试选择文本一样。我可以通过执行以下任务来重现行为:
- 单击StyledText中的字符串 ->对话框打开
- 关闭对话框
- 移动鼠标而无需单击 ->文本被标记为选定
在我的用例中,我不需要鼠标()要触发。但是,没有触发它意味着OS假设鼠标按钮仍在下面并选择文本。如果对话框打开并窃取焦点,这可能是正确的行为。但是,除了必须告诉系统的可能性,鼠标按钮已发布。
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) {}
});
i可以验证mouseup()未调用,因为"触发了鼠标"未打印在控制台上。
处理此问题的最佳方法是什么?我已经尝试将重点放在另一个小部件(setFocus()和forcefocus())上,但这无济于事。
我试图自己打电话给MouseUp:
Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);
这导致消息"放电了",但是选择问题仍然存在。
我可以将代码移动到MouseUp()方法中,但这实际上不是我想要的。对话框应立即出现。我还能做什么?
尝试将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) {}
});
这不是一个好的解决方案。但这可能是某些人的解决方法。
可以将SWT.MODELESS
添加到对话框构造函数中的外壳样式中,该构造函数扩展了jface.dialog.Dialog
。
setShellStyle(SWT.MODELESS);
mouseup()立即发射。
这里的问题是,尽管一个对话框已经打开,但可以通过单击文本打开许多对话框。