Blog

ExtJS and Sencha Touch Themes and Templates

Barras de herramientas en paneles y ventanas

May 20, 2009 | Español | By | 25 Comments | Read in English

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.

Barras de herramientas en paneles y ventanas
Author: Crysfel

I'm a software developer with 6+ years of experience, when I'm not developing software I may be writing a tutorial, you can follow me on twitter

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.

25 Responses to “Barras de herramientas en paneles y ventanas”

  • Crysfel May 20, 2009

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

  • Ronhead May 20, 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

    ;)

  • imzyos May 20, 2009

    Asombroso

  • pablo May 20, 2009

    estaba impaciente por el nuevo tutorial y como siempre genial

  • jose May 26, 2009

    esta muy bien, sigue así

  • spit Jul 21, 2009

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

  • cesar edinson Aug 13, 2009

    me hace acordar cuando programaba con Java; hay sentimientos encontrados

  • jimerosoft Aug 14, 2009

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

    • Crysfel Aug 14, 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

  • Elías Manchón Aug 20, 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.

    • kmil0v Oct 16, 2009

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

  • Héctor Sep 01, 2009

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

    • Crysfel Sep 01, 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

  • Héctor Sep 01, 2009

    AH! ya lo encontré es con

    tooltip:’el texto’ XD

    lo que si hay que colocar primero

    Ext.QuickTips.init();

  • genius551v Oct 10, 2009

    Super buenisimo, que sigan los tutoriales y los videos.

  • Roberto Nov 22, 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.

  • Roberto Nov 22, 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.

  • cesar Jan 03, 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.

  • Fady Feb 26, 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?

  • spawn1690 Mar 07, 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

  • spawn1690 Mar 07, 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

  • uFercho Aug 27, 2010

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

  • César Dec 29, 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.

  • Gustavo May 13, 2011

    Sencillamente Increible! No voy a agregar nada mas.

    Gracias.

Leave a Reply







Updates

RSS

Subscribe to our feeds to receive updates of our newest posts and free tutorials.

Site search

Maybe we have what you need, would you like to search first?

Donations

Would you buy me a cup of coffee? I am sharing my knowledge and time with you, help this project grow. Thank you!