Почему карту участника нельзя использовать для хранения панелей инструментов?

Я определил следующее окно:

qx.Class.define('my.Window', {
   ...

   construct: function(caption, icon) {
       this.base(arguments, caption, icon);
       this.setLayout(new qx.ui.layout.VBox(10));

       this.add(new qx.ui.form.renderer.Single(this.getForm('some')));
       this.add(new qx.ui.form.renderer.Single(this.getForm('other')));

       this.add(this.getToolbar('test'));  // This is shown
       this.add(this.getToolbar('some'));  // This is not shown
       this.add(this.getToolbar('other')); // This is not shown
   },

   members: {
      _forms: {},
      _toolbars: {},

      getForm: function(id) {
          if(this._forms[id]) return this._forms[id];

          if(id = 'some') this._forms[id] = new Form();
          else if(id == 'other') this._forms[id] = new OtherForm();

          return this._forms[id];
      },

      getToolbar: function(id) {
          if(id == 'test') {
             if(this._tb) return this._tb;
             this._tb = new TestToolbar();
             return this._tb;
          }
          else if(id == 'some') this._toolbars[id] = new SomeToolbar();
          else if(id == 'other') this._toolbars[id] = new OtherToolbar();

          return this._toolbars[id];              
      }
  }
});

Когда я показываю окно, отображаются формы ("некоторые" и "другие"). Другие элементы, такие как TestToolbar и список, также отображаются. Однако другие панели инструментов ("test", "some" и "other") не отображаются..

Я пытался изменить _toolbars из объекта в массив, но я получил то же поведение.

1 ответ

Решение

В вашем примере метод getToolbar() всегда будет создавать новую панель инструментов независимо от того, что; это означает, что в то время как конструктор добавит новую панель инструментов в окно, если впоследствии вы вызовете getToolbar() и добавите к ней виджеты, вы добавляете не к той панели инструментов (т.е. добавляете к панели инструментов, которая не была добавлена ​​в окно).

Вот немного измененная версия вашего примера, которая работает на детской площадке

qx.Class.define('my.Window', {
   extend: qx.ui.window.Window,

   construct: function(caption, icon) {
       this.base(arguments, caption, icon);
       this.setLayout(new qx.ui.layout.VBox(10));

       this._toolbars = {};

       //commented out because
       //this.add(new qx.ui.form.renderer.Single(this.getForm('some')));
       //this.add(new qx.ui.form.renderer.Single(this.getForm('other')));

       this.add(this.getToolbar('test'));  // This is shown
       this.add(this.getToolbar('some'));  // This is not shown
       this.add(this.getToolbar('other')); // This is not shown

       this.getToolbar('test').add(new qx.ui.toolbar.Button("Test Button"));
       this.getToolbar('some').add(new qx.ui.toolbar.Button("Some Button"));
       this.getToolbar('other').add(new qx.ui.toolbar.Button("Other Button"));
   },

   members: {
      _forms: null,
      _toolbars: null,

      getForm: function(id) {
          if(this._forms[id]) return this._forms[id];

          if(id == 'some') this._forms[id] = new Form();
          else if(id == 'other') this._forms[id] = new OtherForm();

          return this._forms[id];
      },

      getToolbar: function(id) {
        if (!this._toolbars[id]) {
          if(id == 'test') {
             if(this._tb) return this._tb;
             this._tb = new qx.ui.toolbar.ToolBar();
             return this._tb;
          }
          else if(id == 'some') this._toolbars[id] = new qx.ui.toolbar.ToolBar();
          else if(id == 'other') this._toolbars[id] = new qx.ui.toolbar.ToolBar();
        }
        return this._toolbars[id];              
      }
  }
});
var win = new my.Window("First Window");
win.setWidth(300);
win.setHeight(200);
win.setShowMinimize(false);

this.getRoot().add(win, {left:20, top:20});
win.open();
Другие вопросы по тегам