我注意到,无论操作是由用户还是系统本身引起的,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()));
}
}这将导致无限循环和程序崩溃。如果事件是由系统产生的,你们知道如何关闭事件监听吗?如果事件是由用户引起的,如何开启事件监听?
发布于 2009-09-30 03:24:08
难道您不能在侦听器中设置一个ThreadLocal,并在重新输入时检查它吗?
只需在侦听器上设置一个布尔值字段即可。
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;
}
}
}
}发布于 2009-09-30 03:16:59
我不知道swt但是..。
如果process是幂等的,那么也许只有当它不同于getText时,您才能使用setText
另一种选择是在第一个回调中为小部件设置一些属性,您可以在第二个回调中查询、取消设置和不调用setText。
https://stackoverflow.com/questions/1495761
复制相似问题