如果在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被触发”未在控制台上打印。
处理这个问题的最佳方法是什么?我已经尝试将焦点设置在另一个小部件上(设置Focus()并强制Focus()),但这没有帮助。
我试着自己调用mouseUp:
Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);
这导致消息“MousUp被触发”,但选择问题仍然存在。
我可以将代码移动到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
添加到shell样式,该构造函数扩展了jface.dialog.Dialog
。
setShellStyle(SWT.MODELESS);
MouseUp()现在被解雇了。
这里的问题是,虽然已经打开了一个对话框,但可以通过单击文本打开许多对话框。