Añadir Scripting a programas Java

0
26272

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.

Sobre el
Autor ..

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad