Java SWT:在 mouseDown() 中打开对话框时未触发 mouseUp()
Java SWT: mouseUp() is not fired when opening a Dialog in mousDown()
如果在 StyledText 中单击某个字符串,我的程序会打开一个对话框。所以在 mouseDown() 中,我首先要检查单击了什么,然后打开一个对话框。这行得通。关闭对话框后,不会调用 mouseUp()。这导致在移动光标时 selecting 文本,就好像用户试图 select 文本一样。
我可以通过执行以下任务来重现该行为:
- 单击 StyledText 中的字符串
-> 对话框打开
- 关闭对话框
- 移动鼠标而不点击
-> 文本被标记为 selected
在我的用例中,我不需要触发 mouseUp()。但是没有触发它意味着 OS 假定鼠标按钮仍然按下并且 selects 文本。如果对话框打开并窃取了焦点,这可能是正确的行为。但是必须有可能告诉系统,鼠标按钮已被释放。
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 is fired" 没有打印在控制台上。
处理此问题的最佳方法是什么?我已经尝试将焦点设置在另一个小部件上(setFocus() 和 forceFocus()),但这没有帮助。
我自己尝试调用 mouseUp:
Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);
这导致消息 "MousUp is fired",但 selection 问题仍然存在。
我可以将代码移到 mouseUp() 方法中,但这实际上不是我想要的。该对话框应立即出现。我还能做什么?
这不是一个好的解决方案。但这对某些人来说可能是一种解决方法。
可以在 Dialog 的构造函数中将 SWT.MODELESS
添加到 shell 样式,它扩展了 jface.dialog.Dialog
.
setShellStyle(SWT.MODELESS);
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) {}
});
如果在 StyledText 中单击某个字符串,我的程序会打开一个对话框。所以在 mouseDown() 中,我首先要检查单击了什么,然后打开一个对话框。这行得通。关闭对话框后,不会调用 mouseUp()。这导致在移动光标时 selecting 文本,就好像用户试图 select 文本一样。 我可以通过执行以下任务来重现该行为:
- 单击 StyledText 中的字符串 -> 对话框打开
- 关闭对话框
- 移动鼠标而不点击 -> 文本被标记为 selected
在我的用例中,我不需要触发 mouseUp()。但是没有触发它意味着 OS 假定鼠标按钮仍然按下并且 selects 文本。如果对话框打开并窃取了焦点,这可能是正确的行为。但是必须有可能告诉系统,鼠标按钮已被释放。
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 is fired" 没有打印在控制台上。
处理此问题的最佳方法是什么?我已经尝试将焦点设置在另一个小部件上(setFocus() 和 forceFocus()),但这没有帮助。
我自己尝试调用 mouseUp:
Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);
这导致消息 "MousUp is fired",但 selection 问题仍然存在。
我可以将代码移到 mouseUp() 方法中,但这实际上不是我想要的。该对话框应立即出现。我还能做什么?
这不是一个好的解决方案。但这对某些人来说可能是一种解决方法。
可以在 Dialog 的构造函数中将 SWT.MODELESS
添加到 shell 样式,它扩展了 jface.dialog.Dialog
.
setShellStyle(SWT.MODELESS);
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) {}
});