Ejemplo Data Binding con Apache Pivot

De ChuWiki

En qué consiste el ejemplo[editar]

Vamos en este artículo a hacer con Apache Pivot una pequeña aplicación de escritorio con ventanas para demostrar cómo se pueden pasar y recoger fácilmente datos de estas ventanas a través de un Java bean.

La ventana en cuestión tendrá dos cajas de texto para introducir un número y un texto. Habrá otras dos cajas de texto para mostrar el número y el texto introducidos en las cajas anteriores. Finalmente, habrá también un botón que permitirá pasar los datos introducidos en un lado al otro. La ventana será como la de la figura.

Introducimos el texto y número en el lado izquierdo, pulsamos el botón con la flechita y aparecerán el texto y el número en el lado derecho.


Construcción de la ventana[editar]

La ventana se puede construir bien desde un fichero xml indicando cada uno de los campos, bien directamente desde código java. En este ejemplo vamos a hacerlo desde el fichero XML. El fichero sería el siguiente

<Window title="Ejemplo Data Binding" maximized="true"
	xmlns:wtkx="http://pivot.apache.org/wtkx" xmlns="org.apache.pivot.wtk">
	<content>
		<BoxPane styles="{padding:4, verticalAlignment:'center'}">
			<Form wtkx:id="formCapturaDato">
				<sections>
					<Form.Section>
						<TextInput Form.Label="un numero" textKey="a"
							wtkx:id="capturaNumero" />
						<TextInput Form.label="un texto" textKey="b" wtkx:id="capturaTexto" />
					</Form.Section>
				</sections>
			</Form>
			<PushButton wtkx:id="pasaDatos" buttonData="-->" />
			<Form wtkx:id="formMuestraDato">
				<sections>
					<Form.Section>
						<TextInput Form.Label="un numero" textKey="a"
							wtkx:id="muestraNumero" />
						<TextInput Form.label="un texto" textKey="b" wtkx:id="muestraTexto" />
					</Form.Section>
				</sections>
			</Form>
		</BoxPane>
	</content>
</Window>

El primer tag del xml es un window, para indicar que estamos haciendo una ventana. Debajo un tag content para indicar el contenido de la ventana, que será un BoxPane (un contenedor) para cada todo lo que va dentro. Este BoxPane admitiría atributos para indicar cómo colocar los distintos componentes (en vertical, en horizontal, etc).

En contenido del BoxPane serán principalmente tres cosas:

  • Un Form con el primer formulario para pedir el número y el texto
  • Un botón que al pulsarlo pase los datos de un lado a otro.
  • Otro Form para mostrar los datos recogidos del formulario anterior

Es importante fijarse en los wtkx:id y en los textKey

  • Los wtkx:id nos permitirán, desde nuestro código java, acceder a cada uno de los componentes de la ventana.
  • Los textKey deben coincidir con el nombre de los atributos que más adelante pongamos en nuestro java bean.


El java bean[editar]

El dato que va a ir en los formularios será un Java bean normalito, como el siguiente

package com.chuidiang.ejemplo_apache_pivot;

public class ElDato
{
	private double a;
	private String b;

	public ElDato(double uno, String dos)
	{
		a = uno;
		b = dos;
	}


	public double getA()
	{
		return a;
	}

	public void setA( double numero)
	{
		a = numero;
	}

	public String getB()
	{
		return b;
	}

	public void setB( String texto)
	{
		b = texto;
	}
}

Es importante fijarse que los nombres de los atributos (a y b), coinciden con los textKey de los formularios que hicimos en el XML. Esto le permitirá a Apache Pivot el meter cada atributo en su caja de texto de forma automática.


El código java[editar]

Vamos ahora con la aplicación java. La clase java debe implementar la interface Application de Apache Pivot y escribir los métodos de dicha interface: startup(), shutdown(), suspend() y resume(). Además, pondremos un método main() para poder ejecutar la aplicación.

package com.chuidiang.ejemplo_apache_pivot;

import java.io.FileInputStream;

import org.apache.pivot.collections.Map;
import org.apache.pivot.wtk.Application;
import org.apache.pivot.wtk.DesktopApplicationContext;
import org.apache.pivot.wtk.Display;
import org.apache.pivot.wtk.Window;
import org.apache.pivot.wtkx.WTKXSerializer;

public class PruebaDataBindingApachePivot implements Application
{
        Window window=null;

	public void startup( Display display, Map <String, String> properties)
			throws Exception
	{
		final WTKXSerializer wtkxSerializer = new WTKXSerializer();

		FileInputStream file = new FileInputStream(
				"PruebaDataBindingApachePivot.xml");

                window = (Window) wtkxSerializer.readObject(file);

		window.open(display);

	}

	public boolean shutdown( boolean optional)
	{
		if ( window != null )
		{
			window.close();
		}

		return false;
	}

	public void suspend()
	{
	}

	public void resume()
	{
	}

	public static void main( String [] args)
	{
		DesktopApplicationContext
				.main(PruebaDataBindingApachePivot.class, args);
	}
}

Este código simplemente mostrará la ventana. En la parte del main, a DesktopApplicationContext le indicamos qué clase es nuestra aplicación, en este ejemplo, la misma clase PruebaDataBindingApachePivot . Apache Pivot se encagará entonces de llamar al método startup() de dicha clase.

En el método startup(), cargamos el fichero xml en el que definimos nuestra ventana, PruebaDataBindingApachePivot.xml en el ejemplo. Habitualmente a este fichero se le puede poner extensión .wtkx en vez de .xml. Al cargar el fichero con wtkxSerializer.readObject(), obtenemos la Window principal de la aplicación y la abrimos, para que se muestre, con window.open()

Pero la aplicación no funciona, sólo muestra la ventana. Nos queda ahora hacer el código del botón. Lo primero entonces es obtener el botón para añadirle el listener correspondiente. Recuerda que al botón le pusimos wtkx:id="pasaDatos", con lo que ahora podemos obtener el botón con wtkxSerializar.get() y pasarle el listener así

		PushButton botonPasaDatos = (PushButton) wtkxSerializer.get("pasaDatos");
		botonPasaDatos.getButtonPressListeners().add(new ButtonPressListener()
		{

			public void buttonPressed( Button button)
			{
                             ....
                        }
                 });

Para coger y poner datos en los formularios, debemos primero obtenerlos, igual que con el botón, pero usando los wtkx:id correspondientes a los formularios

formCapturaDato = (Form) wtkxSerializer.get("formCapturaDato");
formMuestraDato = (Form) wtkxSerializer.get("formMuestraDato");

Para coger lo que se ha escrito en la ventana y meterlo en un java bean, haremos esto

ElDato dato = new ElDato();
formCapturaDato.store(dato);

y para rellenar el otro formulario

formMuestraDato.load(dato);

por lo que el código de nuestro botón sería tan tonto como este

botonPasaDatos.getButtonPressListeners().add(new ButtonPressListener()
{
	public void buttonPressed( Button button)
	{
		try
		{
			formCapturaDato.store(dato);
			formMuestraDato.load(dato);
		}
		catch ( Exception e )
		{
			e.printStackTrace();
		}
	}
});

debemos capturar excepciones por si el usuario introduce, por ejemplo, un valor numérico no válido como "abc". Saltaría un NumberFormatException.