我注意到无论操作是由用户或系统本身引起的,都会触发ModifyListener,例如,
Text t = new Text(shell, SWT.BORDER);
t.addModifyListener(new TModifyListener());
...............................................
private class TModifyListener implements ModifyListener
{
@Override
public void modifyText(ModifyEvent event)
{
Text text = (Text) event.widget;
t.setText(process(text.getText()));
}
}
这将导致无限循环并使程序崩溃。如果事件是由系统生成的,你们是否知道如何禁用事件监听,如果事件是由用户引起的话,你是否启用它?
答案 0 :(得分:2)
难道你不能只在你的侦听器中设置一个ThreadLocal并在重新输入时检查它吗?
编辑:实际上它甚至不需要是ThreadLocal,因为SWT是单线程的。只需在侦听器上设置一个布尔字段。
private class TModifyListener implements ModifyListener {
private boolean _setting;
@Override
public void modifyText(ModifyEvent event)
{
if(!_setting) {
_setting = true;
try {
Text text = (Text) event.widget;
t.setText(process(text.getText()));
} finally {
_setting = false;
}
}
}
}
答案 1 :(得分:1)
我不知道swt但是......
如果process
是幂等的,那么只有当setText
与getText
setText
另一种选择是在第一个回调中在窗口小部件上设置一些属性,您可以在第二个回调中查询,取消设置,而不是调用{{1}}。