SmartGwt – Control siguiente
Agosto 26, 2009

En nuestras aplicaciones un requerimiento comun en los controles, es que cuando den un ENTER el foco cambie automaticamente al siguiente control (en un formulario web normalmente lo haces con un TAB). Pero donde manda capitan no gobierna marinero.
Asi que aqui presento una forma de seleccionar el siguiente control en un formulario cuando el usuario presiona ENTER.
TextItem txtUsuario = new TextItem("usuario", "Usuario");
txtUsuario.setTabIndex(0);
txtUsuario.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if ("Enter".equals(event.getKeyName())) {
frmLogin.focusInItem(cmbOficina);
}
}
});
Si no sabes cual es el siguiente control (en una clase base, por ejemplo) puedes utilizar el método getForm() del evento
event.getForm().focusInItem(event.getItem().getTabIndex()+1);
Si utilizas este método, es importante que -por cada control en tu formulario- establezcas la propiedad tabIndex de acuerdo al orden que quieres cambie el tabulador. En este ejemplo falta contemplar cuando llegues al utlimo indice de tabulación (ultimo control). Por lo regular, en este, quisieramos disparar el evento del boton OK.
Espero te sirva, byte!

SmartGwt vs RAP
Agosto 26, 2009

Estaba navegando por el sitio de eclipse y me tope con una sorpresa, Eclipse RAP.
Los ultimos proyectos que he realizado los he hecho con SmartGwt (basado en GWT) pero esta nueva plataforma realmente es tentadora. Asi que me puse a buscar comparativas para ver si realmente vale la pena probar una nueva tecnologia o seguir utilizando y aprendiendo SmartGwt. Lo bueno, es que los expertos ya han estudiado este tema y nos proveen de una explicacion clara de las similitudes y diferencias entre estas dos plataformas… y si no me crees, checa este documento.
Para ponerse a pensar, cierto?
Si alguien ha utilizado estas 2 plataformas y tiene algun comentario, le agradeceriamos lo haga para conocer la experiencia que ha tenido, sus gustos y disgustos.
byte!

SmartGwt – Ventana modal
Agosto 21, 2009

Si quieres mostrar una ventana de forma modal solo tienes que utilizar el método setIsModal de la clase Window antes de hacer el “show”. Ahora que si además quieres que se ensombrezca el fondo para que se entienda más que es una ventana modal y se vea con estilo
, tienes que hacer lo siguiente
LoginWindow login=new LoginWindow();
login.setTitle("Ingresar");
login.setIsModal(true);
login.setShowModalMask(true);
login.centerInPage();
login.show();
Hablando de estilo, si además de esto quieres cambiar el color de la sombra y otras cosas checa en este post. El código que creó el autor del post lo encuentras en las extensiones de smartgwt.

Java – Leer un archivo dentro de un war
Agosto 20, 2009
En Jboss para hacer un deploy simplemente copias tu archivo war en una carpeta del servidor. Él creará virtualmente un sistema de archivos y podrás visualizar tu aplicación.
Pero, que pasa si necesitas leer un archivo (XML, properties, etc) desde tu aplicación. Si la ejecutas desde Eclipse tal vez puedas tener acceso a él, pero al hacer el deploy al servidor te llevarás una triste sorpresa :’(
Para poder leer el archivo en el war lo primero que tienes que hacer es copiarlo a la carpeta WEB-INF/classes y luego cargarlo mediante un Class Loader de la siguiente forma.
Si es un archivo de configuración (.properties), cargalo así
Properties properties=new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResource("app.properties").openStream());
Si es otro tipo de archivo, por ejemplo un archivo de texto
InputStream file=Thread.currentThread().getContextClassLoader().getResourceAsStream("test.txt");
En este foro se explica muy bien lo de los Class Loaders y en esta página encontré como cargar cualquier tipo de archivo.
Happy coding, byte!

SQL Developer – Conexión con un RAC de Oracle
Agosto 20, 2009

Para conectarte a un RAC de Oracle selecciona el tipo de conexion “Avanzada” y escribe directamente la URL de conexion de la siguiente forma:
jdbc:oracle:thin:@
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db-service)
(FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5))
)
)
donde host1-vip es la dirección IP del nodo 1
donde host2-vip es la dirección IP del nodo 2
donde db_service es el nombre de servicio de la base de datos (preguntale a tu DBA
)
Fuente: forums.sun.com
tip: Esta misma URL de conexión la puedes utilizar en el código de tus aplicaciones
jiuu
Have a nice day, byte!

SmartGwt – Cerrar una ventana
Agosto 13, 2009
Cuando creamos nuevas ventanas, muchas veces lo hacemos de la manera siguiente
final Window frmDetalle;
IButton btnAgregar=new IButton("Agregar");
btnAgregar.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
frmDetalle=new Window();
frmDetalle.setTitle("Agregar datos");
frmDetalle.setIsModal(true);
frmDetalle.setShowCloseButton(false);
frmDetalle.setSize("50%", "50%");
frmDetalle.centerInPage();
frmDetalle.show();
}
});
Cada vez que demos clic en el boton se creara una nueva ventana y al “cerrarla” sólo quedará oculta.
Por default, cuando cierras la ventana desde el boton “X” de la barra de titulo, la ventana solo se oculta (es por esto que ocultamos el botón).
Para asegurarnos que esta ventana sea destruída debemos hacer lo siguiente
IButton btnCancelar=new IButton("Cancelar");
btnCancelar.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
frmDetalle.destroy();
}
});
Si tú no creas una nueva instancia cada que vas a mostrar una ventana, puedes estar tranquilo y sólo hacer un “hide”

SmartGwt – Google Plugin for Eclipse
Agosto 9, 2009
Ultimamente he estado desarrollando aplicaciones web en Eclipse utilizando las librerias Gwt-Ext y SmartGwt.
Cuando desarrollaba aplicaciones con Gwt-Ext utilizaba un plugin de eclipse llamado Cypal Studio para facilitar la creacion y configuracion de un nuevo proyecto que utilizara dicha libreria.
Ahora que desarrollo aplicaciones con SmartGwt(el sucesor de Gwt-Ext) pues encontre un plugin muy util(por cierto, desarrollado por google) llamado Google Plugin for Eclipse. Este plugin desde su instalacion te permite instalar tambien el SDK de GWT y el Google App Engine, ademas puedes crear nuevos proyecto de tipo “web application project”, agregar un modulo, un “entry point”, una pagina html que contenga el modulo y otras cosas. Lo unico que no tiene, que si te permitia el plugin de Cypal Studio, es agregar un Servlet o un Servicio Remoto GWT-RPC y mantener las interfaces necesarias en sincronia (Supuestamente esta es una nueva caracteristica ya implementada en la utlima version, pero no lo he probado).
Para saber como instalarlo en Eclipse, lee aqui.
Si estas interesado en el desarrollo de aplicaciones web de tipo RIA, te recomiendo ampliamente que utilices estas herramientas.
Aqui dejo unos videos de como instalar y utilizar estas herramientas

MySQL BLOB – Data too long for column
Agosto 3, 2009
Bueno, pues estoy realizando un proyecto donde inserto algunas imagenes en una base de datos de MySQL.
Para mi sorpresa durante una insercion, la aplicacion me arrojo la siguiente excepcion
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘picture’ at row 1
cuando queria insertar una imagen de apenas unos 215Kb … si 215Kb….. pues para los que venimos del mundo Oracle donde un campo BLOB practicamente no tiene limites, fue toda una sorpresa!
Pues resulta que en MySQL un campo de tipo BLOB tiene una capacidad de apenas unos 65,535 bytes ~ 65Kb.
Para resolver esto solo necesite modificar el tipo de la columna por una de tipo MEDIUMBLOB que tiene una capacidad de 16,777,215 bytes ~ 16.5Mb, que para mis requerimientos es suficiente.
Lo otro que puedes hacer a la hora de declarar el tipo de la columna como BLOB es indicarle la longitud deseada -por ejemplo, BLOB(10485760) para una columna con capacidad de unos 10Mb- y tomara el tipo de BLOB minimo requerido para cubrir la longitud especificada, MEDIUMBLOB en nuestro ejemplo.

