提问者:小点点

SWT:同步更新附加了ModifyListeners的字段文本


欢迎大家对更好的标题提出建议!

有两个字段(净价格和总价格),它们都是可编辑的。它们附加了自己的ModifyListeners,根据适用VAT的百分比更新其他文本的值。

现实情况是,当任何一个侦听器设置另一个Text的text属性时,另一个侦听器就会触发,这会触发调用者Text的侦听器,依此类推,直到它到达StackOverflow。:-)

问:有没有一种众所周知的方法/模式来避免这种行为?

我只能想到Dialog类中的一个字段,让我们说:

boolean stopOverflow; // Stops Listeners from triggering each other

并让侦听器检查它;设置它true/false我们是否已经在修改事件中。希望SWT是单线程的。

类似的问题可以在这里找到:

如何仅为用户交互限制ModifyListener


共2个答案

匿名用户

在执行setText之前调用RemoveModifyListener,然后调用addModifyListener是处理此问题的常用方法之一。

将修改侦听器保留为对话框类中的字段,以便您可以跟踪它:

private ModifyListener modifyListener = new MyModifyListener();

...

text.removeModifyListener(modifyListener);

text.setText(....);

text.addModifyListener(modifyListener).

匿名用户

有一个更简单的解决方案。它不需要Dialog类中的附加字段,并且只需要一个附加的if。

private Text netPrice; // Let's say this holds your net-price text

netPrice.addModifyListener(new ModifyListener() {
    @Override
    public void modifyText(ModifyEvent e) {
        if (netPrice == Display.getCurrent().getFocusControl()) {
            //
            // Do your logic here, it's overflow safe
            //
        }
    }
});

以相同的方式实现您的总价格文本。