java - Java SWT:在 mousDown() 中打开对话框时不会触发 mouseUp()
问题描述
如果在 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() 方法中,但这实际上不是我想要的。该对话框应立即出现。我还可以做些什么?
解决方案
尝试添加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) {}
});
推荐阅读
- import - 从colab中的另一个文件导入功能不起作用
- r - plotly R中的水平虚线
- python - python异步和httpx
- python-3.x - matplotlib python 3中的条形图错误
- c# - Cefsharp 关机不正确
- wordpress - Wordpress:当用户注册时发送通知,但仅适用于具有订阅者角色的用户
- python - 使用 Open-cv 和 Raspberry Pi3B+ 从远到近实时跟踪对象
- dart - 如何使用 mongo_dart 比较两个嵌套文档
- wix - 在 WiX 中创建一个以 LogonUser 作为名称的目录
- c++ - 如何让 C++ 暂停以等待 for 循环中的用户输入