Панель инструментов ExtJS отображается неправильно

У меня есть окно, в котором я хотел бы добавить панель инструментов вверху и панель для загрузки содержимого в оставшейся области. К сожалению, панель инструментов расширяется до непропорционального размера, когда я добавляю панель содержимого. Я пробовал жестко кодировать размер, но это, похоже, не работает. Что я делаю неправильно?

Заранее спасибо за ответы:

  // Main application entry point
  Ext.onReady(function() {
    var loginWin;
    var mainWin;
    var content;

    var form = new Ext.form.FormPanel({
        baseCls: 'x-plain',
        labelWidth: 70,
        //url:'',
        defaultType: 'textfield',

        items: [{
            fieldLabel: ' User Name',
            name: 'username',
            anchor:'100%'  // anchor width by percentage
        },{
        inputType: 'password',
        fieldLabel: ' Password',
            name: 'password',
            anchor: '100%'  // anchor width by percentage
        }]
    });

    content = new Ext.Panel({
        baseCls: 'x-plain',
        layout:'fit',
        anchor:'90%',
        height: 500,
        items: [
           { 
               title: 'blah',
               html: '<div>hello</div>'
           }  
        ]    
    });

    var tb = new Ext.Toolbar({
        height: 100,
        //renderTo: mainWin
    });
    tb.render('toolbar');

    var toolbarPanel = new Ext.Panel({
        layout:'fit',
        anchor:'10%',
        width:100,
        items: tb
    });

    var menu = new Ext.menu.Menu({
        id: 'mainMenu',
        style: {
            overflow: 'visible'     // For the Combo popup
        },
        items: [
            { text: 'blah'
            },
            { text: 'blah2'
            }
        ]
    }); 

    tb.add(
        {
            text: 'Classes',
            iconCls: 'bmenu',  
            handler: function(){ alert('blah'); }
        },
        {
            text: 'GPA',
            iconCls: 'bmenu', 
            handler: function(){ alert('blah'); }
        },
        {
            text: 'Semester Schedule',
            iconCls: 'bmenu', 
            handler: function(){ 
            }
        },
        {
            text: 'Help',
            iconCls: 'bmenu',  // <-- icon
            handler: function(){ alert('blah'); }
        }
    );
    tb.doLayout();

    if(!mainWin){
        mainWin = new Ext.Window({
            applyTo:'main-win',
            resizable: false,
            modal: true,
            layout:'fit',
            width:'80%',
            height:'100%',
            y: 0,
            closeAction:'hide',
            plain: true,
            items: [ toolbarPanel, content ]
        });
    }

    if(!loginWin){
        loginWin = new Ext.Window({
            applyTo:'hello-win',
            closable:false,
            layout:'fit',
            width:300,
            height:130,
            closeAction:'hide',
            plain: true,

            items: form,

            buttons: [{
                text:'Login',
                    handler: function(){
                loginWin.hide();
                        mainWin.show();
            }
            },{
                text: 'Close',
                handler: function(){
                loginWin.hide();
            }
                }]
       });
       loginWin.show(this);
   }

  })

person maximus    schedule 18.03.2011    source источник


Ответы (3)


Похоже, вы неправильно работаете с панелью инструментов:

var toolbarPanel = new Ext.Panel({
    layout:'fit',
    anchor:'10%',
    width:100,
    items: tb
});

Здесь вы говорите этой панели: «Возьми свой единственный предмет и сделай его таким же большим, как я». Вот что делает макет "fit". Так что, естественно, он возьмет панель инструментов, которую вы ему дали в items, и расширит ее до размера панели.

Ext.Panel объекты имеют tbar свойство конфигурации, предназначенное для хранения панели инструментов. Вам не нужна панель для панели инструментов и еще одна панель для вашего контента. Вместо этого добавьте панель инструментов на панель содержимого. Кроме того, не беспокойтесь о явном отображении панели инструментов или добавлении элементов постфактум. Лучше и понятнее писать объекты вместе, где они будут инициализированы (если это возможно)

Вот как я бы рекомендовал создать вашу панель контента:

content = new Ext.Panel({
    baseCls: 'x-plain',
    layout:'fit',
    tbar: [
    {
        text: 'Classes',
        iconCls: 'bmenu',  
        handler: function(){ alert('blah'); }
    },
    {
        text: 'GPA',
        iconCls: 'bmenu', 
        handler: function(){ alert('blah'); }
    },
    {
        text: 'Semester Schedule',
        iconCls: 'bmenu', 
        handler: function(){ 
        }
    },
    {
        text: 'Help',
        iconCls: 'bmenu',  // <-- icon
        handler: function(){ alert('blah'); }
    }],
    items: [
       { 
           title: 'blah',
           html: '<div>hello</div>'
       }  
    ]    
});

Также обратите внимание, что я убрал атрибут height вашей панели, так как он помещается в окно с макетом «подходящим», так что это окно будет выполнять все размеры (нет необходимости указывать на самой панели).

    mainWin = new Ext.Window({
        applyTo:'main-win',
        resizable: false,
        modal: true,
        layout:'fit',
        width:'80%',
        height:'100%',
        y: 0,
        closeAction:'hide',
        plain: true,
        items: [ content ]
    });

Удачи!

person Sean Adkinson    schedule 18.03.2011

Обратите внимание, что Ext.Toolbar имеет установленное по умолчанию значение minHeight ("2.6em", iirc) — возможно, вам придется переопределить это в своей конфигурации.

person btk    schedule 28.01.2013

Это не ваша проблема, но у меня была проблема с минимизированным кодом ExtJS, который не отображался. В tbar был разделитель между элементами, хотя неминифицированная панель инструментов отображалась правильно. Я думаю, что у Sencha есть специальная функция для этого, но она исправила это.

}, ' ', {
person MacGyver    schedule 17.04.2014