如果操作未由用户触发,如何禁用SWT事件侦听

时间:2009-09-30 01:47:25

标签: java event-handling events swt

我注意到无论操作是由用户或系统本身引起的,都会触发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()));
    }
}

这将导致无限循环并使程序崩溃。如果事件是由系统生成的,你们是否知道如何禁用事件监听,如果事件是由用户引起的话,你是否启用它?

2 个答案:

答案 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是幂等的,那么只有当setTextgetText

不同时,您才可以setText

另一种选择是在第一个回调中在窗口小部件上设置一些属性,您可以在第二个回调中查询,取消设置,而不是调用{{1}}。