Aprendiendo Ext JS 3

Barras de herramientas en paneles y ventanas Más videos

Descripción del tema

El panel cuenta con la posibilidad de agregarle una barra de herramientas en la parte superior, el tema de hoy muestra como realizar esto además veremos un poco acerca de cómo utilizar los botones y menús de Ext JS.

Material de apoyo

Para continuar es necesario descargar el material de apoyo, descomprimir y copiar el contenido a la carpeta “panels” que creamos al inicio de este capítulo, la cual está dentro de la carpeta “curso” en el servidor Web que hemos instalado en el primer capítulo. El material de apoyo es un HTML que importa al Framework de Ext JS y además tiene definidas unas clases de CSS que utilizaremos más adelante, hay un archivo JS en blanco, dentro de este vamos a escribir el código del tutorial y también viene una carpeta con iconos que vamos a usar para los botones. El ejercicio que haremos será simular un explorador Web, utilizando una barra de herramientas para los botones necesarios, vamos a usar un iFrame para desplegar las páginas que mediante la barra de herramientas le estaremos indicando.

Ext JS 3.0

A partir de este tema vamos a utilizar la versión 3.0 del Framework de Ext JS, así que si no lo tienes hay que descargarlo y copiarlo a nuestro servidor Web dentro de la carpeta “curso” donde estamos alojando los ejemplos de este curso.

Empaquetando el tutorial

Vamos a empaquetar el código del tutorial para evitar conflictos en el futuro.
//the namespace for this tutorial
Ext.ns('com.quizzpot.tutorial');

//the blank image
Ext.BLANK_IMAGE_URL = '../ext-3.0-rc1/resources/images/default/s.gif';

com.quizzpot.tutorial.ToolbarTutorial = {
	init: function(){
		//code goes here
	}
}

Ext.onReady(com.quizzpot.tutorial.ToolbarTutorial.init,com.quizzpot.tutorial.ToolbarTutorial);

Barra de herramientas

Vamos a crear una ventana que contenga una barra de herramientas en la parte superior de la siguiente manera:
this.win = new Ext.Window({
	title: 'Quizzpot Explorer',
	width: 600,
	height:450,
	tbar: [  // <--- ToolBar
		{text:'Back'}, // <--- Buttons
		{text:'Forward'},
		{text:'Reload'},
		{text:'Stop'},
		{text:'Home'}
	],
	maximizable: true,
	maskDisabled: true,
	bodyStyle: 'background-color:#fff',
	html: '<iframe id="container" src="http://www.google.com" style="width:100%;height:100%;border:none"></iframe>'
});
		
this.win.show();
El código anterior crea una ventana con un iFrame donde muestra la página de Google, además tiene algunas otras propiedades que ya las hemos estudiado en temas anteriores por lo tanto no las explicaré ahora, en este tema quiero concentrarme en la propiedad “tbar” la cual es la responsable de asignarle al panel (recuerda que “Window” hereda las propiedades del “Panel”) una barra de herramientas en la parte superior, la cual contiene botones en este caso.
Barra de herramientas

Barra de herramientas básica

La propiedad “tbar” acepta un arreglo de botones o un objeto de configuración para el componente “Ext.Toolbar” o una instancia del componente “Ext.Toolbar”, por lo tanto el código anterior lo podemos escribir también de la siguiente manera:
this.win = new Ext.Window({
	title: 'Quizzpot Explorer',
	width: 600,
	height:450,
	tbar: {
		items: [
			{text:'Back'},
			{text:'Forward'},
			{text:'Reload'},
			{text:'Stop'},
			{text:'Home'}
		]
	},
	maximizable: true,
	maskDisabled: true,
	bodyStyle: 'background-color:#fff',
	html: '<iframe id="container" src="http://www.google.com" style="width:100%;height:100%;border:none"></iframe>'
});
		
this.win.show();
En el código anterior la propiedad “tbar” recibe un objeto de configuración para el componente “Ext.Toolbar”, esto es útil para cuando necesitamos utilizar la propiedad “defaults” que hemos estudiado en el tema de los paneles, además podemos utilizar todas las propiedades del componente (Toolbar). Ahora voy a mostrar como la propiedad “tbar” acepta una instancia del componente Toolbar:
//creates the tool bar
var toolbar = new Ext.Toolbar({
	items: [
		{text:'Back'},
		{text:'Forward'},
		{text:'Reload'},
		{text:'Stop'},
		{text:'Home'}
	]
});
		
this.win = new Ext.Window({
	title: 'Quizzpot Explorer',
	width: 600,
	height:450,
	tbar: toolbar, // <--- Toolbar
	maximizable: true,
	maskDisabled: true,
	bodyStyle: 'background-color:#fff',
	html: '<iframe id="container" src="http://www.google.com" style="width:100%;height:100%;border:none"></iframe>'
});
		
this.win.show();
Como se han dado cuenta, estas tres maneras de crear una barra de herramientas son muy convenientes para diferentes situaciones, vamos a utilizar la última para continuar con nuestro ejercicio.

Agregar íconos a los botones

Para agregar un ícono a un botón necesitamos crear una clase CSS donde asignaremos el ícono que queremos usar como background, vamos a definir que no se repita y ponerle la propiedad “!important” para que se pueda mostrar correctamente:
.back{
	background: url(icons/arrow_left.png) no-repeat !important;
}
Ahora usamos la propiedad “iconCls” del objeto de configuración para la nuestro “toolbar”.
var toolbar = new Ext.Toolbar({
	items: [
		{text:'Back',iconCls:'back'}, //<--- adding an icon to the button
		{text:'Forward'},
		{text:'Reload'},
		{text:'Stop'},
		{text:'Home'}
	]
});
Barra de herramientas

Botón con ícono

Vamos a agregar el resto de los iconos a los botones faltantes; las clases de CSS han sido definidas en el HTML.
var toolbar = new Ext.Toolbar({
	items: [
		{text:'Back',iconCls:'back'},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'}
	]
});
Barra de herramientas

Botones con íconos

Por defecto la alineación del ícono es la parte izquierda del botón, esto lo podemos configurar mediante la propiedad “iconAlign” la cual acepta como valor “top”, “right”, “bottom” o “left”. Voy a utilizar la propiedad “defaults” del toolbar para aplicar esta configuración a todos los botones.
var toolbar = new Ext.Toolbar({
	defaults:{
		iconAlign: 'top' // <--- we change the icon position
	},
	items: [
		{text:'Back',iconCls:'back'},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'}
	]
});
Barra de herramientas

Cambiando la alineación de los íconos

Al hacer este cambio podemos ver como ha cambiado la posición del ícono, ahora se encuentra en la parte superior del botón, pero notemos que el ícono está alineado a la izquierda, para corregir esto necesitamos centrarlo desde la clase CSS donde definimos la imagen.
.back{
	background: url(icons/arrow_left.png) center 0px no-repeat !important;
}
Con esto veremos como los iconos se han centrado en el botón.
Barra de herramientas

Íconos centrados en el botón

Botones alineados a la derecha

Cuando necesitemos que los botones estén alineados a la derecha del panel, únicamente debemos utilizar el componente “Ext.Toolbar.Fill” para que nos posicione los botones en el lugar correcto.
var toolbar = new Ext.Toolbar({
	defaults:{
		iconAlign: 'top'
	},
	items: [
		{text:'Back',iconCls:'back'},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'},
		new Ext.Toolbar.Fill(), // <--- we fill the empty space
		{text:'Bookmarks',iconCls:'book'}// now the fallowing buttons are in the right side
	]
});
Barra de herramientas

Botones alineados a la derecha

También podemos utilizar el atajo “->” para el componente “Ext.Toolbar.Fill”, de esta manera escribiremos menos.
var toolbar = new Ext.Toolbar({
	defaults:{
		iconAlign: 'top'
	},
	items: [
		{text:'Back',iconCls:'back'},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'},
		'->', // <--- shortcut for the Ext.Toolbar.Fill class
		{text:'Bookmarks',iconCls:'book'}// now the fallowing buttons are in the right side
	]
});
Barra de herramientas

La pantalla resulta igual a la anterior

Una caja de texto en la barra de herramientas

Vamos agregar una caja de texto a la barra de herramientas para que el usuario pueda introducir una dirección y al darle clic en el botón buscar o presionar la tecla “enter” el iFrame muestre la página solicitada.
var toolbar = new Ext.Toolbar({
	defaults:{
		iconAlign: 'top'
	},
	items: [
		{text:'Back',iconCls:'back'},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'},
		'-', // <--- add a vertical separator bar between toolbar items 
		{xtype:'textfield',id:'url',width:250,enableKeyEvents:true}, //<--- the textfield
		{iconCls:'goto'},
		'->', 
		{text:'Bookmarks',iconCls:'book'}
	]
});
Barra de herramientas

Separador vertical, caja de texto y botón sin texto

El código anterior tiene tres puntos importantes, primero se está agregando un separador vertical utilizando un guión, este es un atajo para la clase “Ext.Toolbar.Separator”, el segundo punto importante es que se está modificando el “xtype” del botón por “textfield” (para este caso), de esta manera cambiamos el tipo de componente especificando en este caso usaremos una caja de texto en lugar del botón, el tercer punto importante es que estamos definiendo un botón que no tiene texto, únicamente tiene un ícono.

Agrupando botones

La nueva versión de Ext JS (v 3.0) nos permite formar grupos de botones, esto es muy útil para separar por funcionalidad los botones semejantes o que se relacionan de una u otra manera, para este ejemplo vamos agrupar la caja de texto y el botón buscar.
var toolbar = new Ext.Toolbar({
	defaults:{
		iconAlign: 'top'
	},
	items: [
		{text:'Back',iconCls:'back'},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'},
		'-',{
			xtype: 'buttongroup', // <--- grouping the buttons
			items:[
				{xtype:'textfield', id:'url', width:250, enableKeyEvents: true},
				{iconCls:'goto'}
			]
		},
		'->', 
		{text:'Bookmarks',iconCls:'book'}
	]
});
Barra de herramientas

Botones agrupados

También podríamos ponerle un título al grupo usando la propiedad “title” al componente “buttongroup”, pero para este ejemplo no lo haremos, puedes probar si lo deseas y ver el resultado.

“Split buttons” y menús

Vamos hacer que el botón “back” muestre un menú donde aparezcan los sitios que hemos visitado, simulando el historial de navegación.
var toolbar = new Ext.Toolbar({
	defaults:{
		iconAlign: 'top'
	},
	items: [
		{
			text:'Back',iconCls:'back',
split: true, // <--- split the button
			menu:{ // <--- add a menu to the button
				items: [
					{text:'Yahoo!'}, // <--- This is an item for the menu
					{text:'Quizzpot'},
					{text:'Site point'}
				]
			}
		},
		{text:'Forward',iconCls:'forward'},
		{text:'Reload',iconCls:'reload'},
		{text:'Stop',iconCls:'stop'},
		{text:'Home',iconCls:'home'},
		'-',{
			xtype: 'buttongroup',
			items:[
				{xtype:'textfield', id:'url', width:250, enableKeyEvents:true},
				{iconCls:'goto'}
			]
		},
		'->', 
		{text:'Bookmarks',iconCls:'book'}	]
});
Barra de herramientas

Botón con submenú

El código anterior muestra como se ha agregado un menú al botón “back”, es importante mencionar que cada opción del menú puede tener otro submenú.

Asignar acciones a los botones

Hasta ahora tenemos lista la GUI de nuestro explorador, pero no hace absolutamente nada, a continuación voy a mostrar como es que podemos asignarle acciones a los botones al momento de darles clic. Voy a modificar el botón “Home” para que cuando el usuario de clic sobre el botón nos lleve hacia la página de inicio, en este caso “google.com”.
//… código removido por cuestiones de simplicidad
{
text:'Home', iconCls:'home', 
handler: function(){
this.gotoUrl('http://www.google.com');
}.createDelegate(this)
},
//… código removido por cuestiones de simplicidad
La propiedad “handler” recibe una función donde podemos escribir todas las acciones que necesitamos realizar cuando el usuario de clic sobre el botón, el método “createDelegate” es muy importante para cambiar el scope de la función anónima, de esta manera la variable “this” hará referencia al objeto donde está el método “gotoUrl” (ToolbarTutorial), dentro de la función anónima estoy mandando a ejecutar una función que todavía no he definido, pero su propósito será cambiar el “src” del iFrame. Vamos a definir la función responsable de mostrar la página solicitada, este método lo usaremos en varias ocasiones.
com.quizzpot.tutorial.ToolbarTutorial = {
	init: function(){
		//código removido por cuestiones de simplicidad
	},
	//esta función cambia la url del iFrame
gotoUrl: function(url){
		if(!Ext.isEmpty(url)){
			if(!/^http:\/\//.test(url)){
				url = 'http://'+url;
			}
			
			var iframe = Ext.get('container');
			iframe.dom.src = url;
			Ext.getCmp('url').setValue(url);
			this.win.setTitle(url +' - Quizzpot Explorer');
		}
	}
}
La función anterior primero verifica que el parámetro “url” tenga algo, luego se asegura de que comience con “http://” de no ser así se lo agrega, luego cambia la propiedad “src” del iFrame y le asigna la url a la caja de texto y al título de la ventana. Ahora voy a modificar el botón “Search” para que cuando el usuario de clic sobre él, tome lo que hay en la caja de texto y llame a la función “gotoUrl”.
{iconCls:'goto',handler: this.search.createDelegate(this)}
En el código anterior no creé una función anónima, sino que le asigné una función del objeto “ToolbarTutorial” la cual vamos a definir a continuación:
com.quizzpot.tutorial.ToolbarTutorial = {
	init: function(){
//… no se muestra el código para simplificar las cosas
	},
	
	search: function(btn,event){
		this.gotoUrl(Ext.getCmp('url').getValue()); //<--- se toma lo que el usuario puso en la caja de texto
	},
	
	gotoUrl: function(url){
		//… no se muestra el código para simplificar las cosas
	}
}
La función “search” únicamente invoca a la función “gotoUrl” con lo que hay en la caja de texto.
Barra de herramientas

Navegando en el explorador

Conclusiones

En el tema de hoy vimos como crear una barra de herramientas, como usar los botones y como crear menús, además vimos como ponerles comportamiento a los botones, si hay alguna duda al respecto pueden realizarla en el foro o bien dejar sus comentarios en esta misma página.

Te gustaría recibir más tutoriales como este en tu correo?

Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.

Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!

Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.

¿Olvidaste tu contraseña?

27Comentarios

  • Avatar-3 Crysfel 20/05/2009

    Queda pendiente el video... pronto lo voy a subir :D

    • Avatar-2 Ronhead 20/05/2009

      Esta bueno el post = mantener una barra de botones para que funcione un iframe es un poco molesto podrian aplicar eso para la otra ;)

      • Avatar-5 imzyos 20/05/2009

        Asombroso

        • Avatar-9 pablo 20/05/2009

          estaba impaciente por el nuevo tutorial y como siempre genial

          • Avatar-6 jose 26/05/2009

            esta muy bien, sigue así

            • Avatar-2 spit 21/07/2009

              Tuto muy bueno porque con estas explicaciones se puede probar muchas cosas...ok

              • Avatar-3 cesar edinson 13/08/2009

                me hace acordar cuando programaba con Java; hay sentimientos encontrados

                • Avatar-6 jimerosoft 14/08/2009

                  porque nunca me abren los ejemplos cuando los descargo??...

                  • Avatar-8 Crysfel 14/08/2009

                    Porque necesitas descargar la librería de Ext y ponerla dentro del servidor web que instalamos en el primer tema del curso ;) de lo contrario tienes que modificar las rutas a la librería en el HTML que descargas. saludos

                    • Avatar-11 Elías Manchón 20/08/2009

                      Hola, Saben si se puede cargar algún tipo de complemento en el editor para que funcione el autocompletar con ExtJS. Encontré algo parecido para Eclipse pero faltan muchísimos métodos y propiedades de los objetos. Gracias Crysfel muy bueno el tuto.

                      • Avatar-9 Héctor 01/09/2009

                        muy bueno, como siempre. una pregunta: como puedo asginarle tooltips a los botones?

                        • Avatar-4 Héctor 01/09/2009

                          AH! ya lo encontré es con tooltip:'el texto' XD lo que si hay que colocar primero Ext.QuickTips.init();

                          • Avatar-5 Crysfel 01/09/2009

                            Utilizas la propiedad "tooltip" del botón, la cual acepta un string o un object de configuración para el componente "QuickTips", recuerda que tienes que inicializar el quicktip para que aparescan los "globitos": Ext.QuickTips.init(); saludos

                            • Avatar-10 Crysfel 01/09/2009

                              Así es ;)

                              • Avatar-7 genius551v 11/10/2009

                                Super buenisimo, que sigan los tutoriales y los videos.

                                • Avatar-2 kmil0v 16/10/2009

                                  no se si te sirva, pero Netbeans tiene un buen autocompletado de ExtJS, saludos.

                                  • Avatar-2 Roberto 23/11/2009

                                    Hola Crysfel, muy buenos los tutoriales son excelentes haber necesito una manita por favor,estoy haciendo una aplicacion con varias ventanas las cuales son abiertas cada una con su boton correspondiente, mi duda es esta cual es la mejor forma al evento close, seria ocultar la ventana? porq al momento de cerrarla creo q se destruye el objeto. y al clickar en los botones de nuevo me sale error bueno esto es cuando se cierra, pero si la oculto nada mas ahora al clickar en el boton funciona ok, las ventanas se quedan en el estado de cuando se oculto, como hacer para cambiar de estado de acuerdo a los datos que se generan en el servidor web.

                                    • Avatar-4 Roberto 23/11/2009

                                      haber de nuevo que hacer con las ventanas al cerrarlas. porq si hago que se oculten se guarda ese estado por ejemplo si muevo, redimensiono la ventana, al clickar en el boton para mostrar la ventana me muestra en el estado en q se oculto, como hacer para que no me guarde ese estado y me muestre como si fuera la primera vez.

                                      • Avatar-12 cesar 04/01/2010

                                        HOla bueno el tutorial tengo una duda que no me deja dormir en la parte donde dices "el método “createDelegate” es muy importante para cambiar el scope de la función anónima, de esta manera la variable “this” hará referencia al objeto donde está el método “gotoUrl” (ToolbarTutorial)" no comprendo porque this estaria apuntando a ToolbarTutorial (ya lo comprobe y es verdad) es que esa funcion anonima no esta dentro de el boton home?? es decir la funcion define el metodo handler del boton entonces el this de createDelegate deberia hacer referencia al boton home y no a ToolbarTutorial, te rogaria expklicaras un poquito mas sobre esta funcion.

                                        • Avatar-6 Fady 26/02/2010

                                          Hola que tal, un excelente tutorial,estoy empezando a aprender a trabajar con EXTJS,pero he tenido un pequeño problema con este ejemplo, los iconos quedan detras de las letras, eso a q se debe?

                                          • Avatar-7 spawn1690 07/03/2010

                                            Que tal excelente post en verdad quien se iba a imaginar poder crear un pequeño navegador con extjs, la verdad quede impactado ya que soy nuevo y he aprendido de tu tutorial, mira la verdad hay un metodo que no entiendo es el createDelegate(this) aun no entiendo bien para que funciona espero me puedas aclarar la duda gracias

                                            • Avatar-3 spawn1690 07/03/2010

                                              ;ira ya empeze a entender un poco mas mi duda anterior pero ahora me salio otra con el metodo gotoURL la verdad se me hizo demasiado compleja no se si me la podrias detallar uan mas es que no entiendo bien gracias

                                              • Avatar-4 uFercho 27/08/2010

                                                Excelente post a seguir con el proximo para terminar los antes posible xD

                                                • Avatar-10 César 29/12/2010

                                                  Excelentes tutoriales pero me pasa que quiero abrir una pagina que esta en asp y tiene https lo que hace es desaparecer la ventana de Ext y la carga el pantalla completa del navegador como que me elimina el frame de extjs como podría hacer para que cargue la web dentro de la ventana de extjs gracias.

                                                  • Avatar-7 Gustavo 14/05/2011

                                                    Sencillamente Increible! No voy a agregar nada mas. Gracias.

                                                    • Avatar-7 Oscar 15/10/2012

                                                      Hola: En la demo no os está cargando Google. Por qué? Saludo.

                                                      • Avatar-8 ricardus 06/01/2013

                                                        donde podemos colocar el minimizar que le faltaria a este codigo para q aparesca aver this.win = new Ext.Window({ title: 'Ricardus Explorer', width: 600, height:450, tbar: toolbar, maximizable: true, maskDisabled: true, bodyStyle: 'background-color:#fff', html: '' }); this.win.show(); //fire when the user clicks the minimize button win.on('minimize',function(win){ console.debug('minimizando...'); win.collapse(); //collapse the window }); }, search: function(btn,event){ this.gotoUrl(Ext.getCmp('url').getValue()); }, gotoUrl: function(url){ if(!Ext.isEmpty(url)){ if(!/^http:\/\//.test(url)){ url = 'http://'+url; } var iframe = Ext.get('container'); iframe.dom.src = url; Ext.getCmp('url').setValue(url); this.win.setTitle(url +' - Ricardus Explorer'); } } } Ext.onReady(com.quizzpot.tutorial.ToolbarTutorial.init,com.quizzpot.tutorial.ToolbarTutorial);

                                                        Instructor del curso

                                                        Crysfel3

                                                        Autor: Crysfel Villa

                                                        Es ingeniero de software con más de 7 años de experiencia en desarrollo web.

                                                        Descarga Código Fuente Ver Demostración

                                                        Regístrate a este curso

                                                        Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.

                                                        Tendrás acceso a descargar los videos, códigos y material adicional.

                                                        Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.

                                                        Llevarás un registro de tu avance.