取消阻止小部件而不会失去焦点

Unblock widget without lose focus

我有一个焦点小部件和一个被阻止的小部件,当我取消阻止被阻止的小部件时,焦点被盗

看这个例子(点击一次 运行 按钮):http://www.qooxdoo.org/current/playground/#%7B%22code%22%3A%22var%2520field%2520%253D%2520new%2520qx.ui.form.TextField()%253B%250A%250Avar%2520button%2520%253D%2520new%2520qx.ui.form.Button(%2522A%2520button%2522)%253B%250A%250Avar%2520blocker%2520%253D%2520new%2520qx.ui.core.Blocker(button)%253B%250A%250Athis.getRoot().add(field%252C%2520%257Btop%253A%252010%252C%2520left%253A%252010%257D)%253B%250Athis.getRoot().add(button%252C%2520%257Btop%253A100%252C%2520left%253A10%257D)%253B%250A%250Ablocker.block()%253B%250Afield.focus()%253B%250Ablocker.unblock()%253B%22%2C%20%22mode%22%3A%22ria%22%7D

我不太确定您尝试实现的是 qx.ui.core.Blocker 的目的。该实现不考虑焦点在块期间移动。

如果您调用方法 block,代码会尝试在 块完成并保存该小部件之前确定焦点 的小部件,然后将焦点设置为要阻止的小部件,并在取消阻止时将焦点恢复到已保存的小部件。

通过在子类中添加少量内容,您可以避免这种关注 save/restore:

  qx.Class.define("qx.ui.core.MyBlocker",
  {
    extend : qx.ui.core.Blocker,

    properties : {

      backupActiveWidget :
      {
        check : "Boolean",
        init : true
      }

    },

    members : {  
      // overridden
      _backupActiveWidget : function() {
        if(this.getBackupActiveWidget() === false) {
          return
        }

        this.base(arguments);
      }
    }
  });

并以这种方式使用拦截器:

var blocker = new qx.ui.core.MyBlocker(widgetToBeBlocked);
blocker.setBackupActiveWidget(false);

这应该可以防止阻止者窃取可能在阻止期间设置的焦点。