Bean Shell
Cuando construimos una aplicación profesional, es muy difícil prever todos
los usos que nuestros usuarios querrán hacer de ella.
Los paquetes ofimáticos ya incluyen un montón de funcionalidades pero también
permite al usuario final personalizar las herramienta, e incluso automatizar
tareas, proporcionando a estos usuarios un lenguaje de Script.
Otra caso similar, que asociaremos de un modo inmediato, lo encontramos
con las páginas HTML que podemos potenciar con el uso de lenguajes de Script,
añadiendo efectos, validaciones personalizadas, etc.
Vamos a ver como podemos incorporar en nuestras aplicaciones Java capacidades
de Scripting e incluso que el propio lenguaje de Script sea también Java (cosa
que me han preguntado últimamente varias veces)
BeansShell
BeansShell es un producto gratuito que nos permite precisamente esto..
Vamos al Web del producto y nos lo descargamos
http://www.beanshell.org/home.html.
Realmente solo necesitamos un Jar….
Haciendo simplemente doble click… nos aparece un interfaz interactivo donde
podemos empezar a probar.
Podemos ver un ejemplo simple. Si hemos trabajado anteriormente con otros
lenguajes de Script, tardamos en programar lo que invirtamos en ojear la guía de
usuario.
Integración en programas Java
Os vamos a enseñar como construir una pequeña aplicación visual donde dejar
un área para que el usuario escriba su programa y altere algún elemento gráfico
(la posición de un botón).
En NetBeans, creamos un nuevo proyecto… (al final tenéis el código por lo
que no hace realmente falta ningún entorno visual… nos vale el notepad)
Elegimos el directorio de trabajo
Cargamos el Jar para que se vean las clases dentro del entorno
Elegimos el fichero adecuado
Ahora añadimos visualmente una clase visual, a través del asistente
Elegimos la clase deseada (un diálogo)
Le asignamos un nombre a mi clase
Y pasamos a pintar nuestro controles.
Elegimos un Layout nulo para posicionar libremente los
componentes por pantalla.
Vamos a pintar un botón llamado elementoMovil que solo
usaremos para animar desde nuestro Script
Y al hacer doble click en el botón ejecutarScript, nos dirige al
código
Hemos usado NetBeans para crear el esqueleto….
Os mostramos el código generado y, en azul, las líneas añadidas.
import bsh.*; import java.util.*; /** * @author Roberto Canales */ public class ventanascript extends java.awt.Dialog { /** Creates new form ventanascript */ public ventanascript(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); this.setSize(500,400); } private void initComponents() { botonSimple = new java.awt.Button(); areaTexto = new java.awt.TextArea(); label1 = new java.awt.Label(); button1 = new java.awt.Button(); setLayout(null); setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); botonSimple.setActionCommand("ejecutar"); botonSimple.setLabel("ejecutarScript"); botonSimple.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonSimpleActionPerformed(evt); } }); add(botonSimple); botonSimple.setBounds(160, 340, 150, 24); add(areaTexto); areaTexto.setBounds(20, 80, 460, 190); label1.setText("Introduzca el Script a Ejecutar"); add(label1); label1.setBounds(140, 50, 230, 20); button1.setLabel("elementoMovil"); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { button1ActionPerformed(evt); } }); add(button1); button1.setBounds(40, 290, 100, 20); pack(); } private void button1ActionPerformed(java.awt.event.ActionEvent evt) { } private void botonSimpleActionPerformed(java.awt.event.ActionEvent evt) { String elScript = areaTexto.getText(); try { Interpreter i = new Interpreter(); i.set("boton", button1 ); i.eval(elScript); } catch(Exception e) { System.out.println("Error en aplicacion " + e.getMessage()); } } private void closeDialog(java.awt.event.WindowEvent evt) { setVisible(false); dispose(); } public static void main(String args[]) { new ventanascript(new java.awt.Frame(), true).show(); } private java.awt.TextArea areaTexto; private java.awt.Button botonSimple; private java.awt.Button button1; private java.awt.Label label1; } |
Como punto especial, prestad atención a esta línea con la que intercambiamos
variables entre nuestro programa Java y el entorno de Scripting
i.set(«boton», button1 );
Ejecución
Arrancamos aplicación y escribimos es código Script.
Si pinchamos el botón ejecutarScript….. magia … mirad como se mueve el
botón… (ahora elementoMovil está más al centro de la pantalla)
También podemos crear métodos (como este ejemplo que introduce un retardo),
crear objetos, gestionar los errores, etc…
retardo(int segundos) { try { Thread.currentThread().sleep(segundos * 1000); } catch(Exception e) { } } punto = boton.getLocation(); for(i=0;i<100;i++) { boton.setLocation(punto.x + i, punto.y); } |
Conclusiones
Es francamente impresionante el mundo de posibilidades que se nos abre, de un
modo tan simple, en el desarrollo de aplicaciones profesionales.
Ya tenemos un elemento más en el puzzle arquitectónico Java…. la gracia es
saber que utilizar en cada caso … sin abusar y complicar innecesariamente los
proyectos.