Ejemplo TableView con Apache Pivot

De ChuWiki
Saltar a: navegación, buscar

Vamos a ver aquí un ejemplo de TableView de Apache Pivot en una aplicación de escritorio en java. La ventana que obtendremos será la de la figura y pulsando el botón iremos añadiendo filas a la tabla.

TableView-Apache-Pivot.jpg


Construcción de la ventana

Para la ventana usaremos un fichero xml de nombre PruebaTableViewApachePivot.wtkx y cuyo contenido es el siguiente:

<Window title="Ejemplo TableView" maximized="true"
   xmlns:wtkx="http://pivot.apache.org/wtkx" xmlns="org.apache.pivot.wtk">
   <content>
      <BoxPane styles="{padding:4, verticalAlignment:'center'}">
         <PushButton wtkx:id="botonNuevoElemento" buttonData="Nuevo" />
         <ScrollPane>
            <view>
               <TableView wtkx:id="laTabla">
                  <columns>
                     <TableView.Column name="a" width="180"
                        headerData="Er numero" />
                     <TableView.Column name="b" width="60"
                        headerData="Er texto" />
                  </columns>
               </TableView>
            </view>
            <columnHeader>
               <TableViewHeader tableView="$laTabla" />
            </columnHeader>
         </ScrollPane>
      </BoxPane>
   </content>
</Window>

Primero un tag Window para indicar la ventana de la aplicación. Un BoxPane que va a llevar dos componentes, un botón (el de añadir nuevos elementos a la tabla) y un ScrollPane donde irá metida la tabla. Este ScrollPane tiene a su vez dos elementos, view que es la tabla en sí y columnHeader, que es la cabecera de la tabla.

Tanto el botón como la tabla llevan un wtkx:id que nos servirá para luego, desde nuestro código java, poder acceder a ellos y "hacerles cosas".

El TableView lleva dos columnas TableView.Column a las que hemos puesto un name (a y b) que es importante. Debe coincidir con el nombre del atributo del Java bean que usemos como elemento para las filas de esta tabla. Cuando hablemos del Java bean volveremos a indicarlo. El TableView.Column lleva también un headerData, con el texto que aparecerá en la cabecera, así como el ancho deseado para cada columna.

En el columnHeader el elemento es un TableViewHeader, al que indicamos con tableView que la tabla es $laTabla.


El dato para las filas

Como dato para las filas de la tabla usaremos el siguiente java bean

package com.chuidiang.ejemplo_apache_pivot;

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

    private double a;

    public double getA()
    {
        return a;
    }

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

    public String getB()
    {
        return b;
    }

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

    private String b;
}

Aquí es importante fijarse que los nombres de los atributos a y b coinciden con los name que pusimos en el TableView.Column name del fichero xml. De esta forma, Apache Pivot sabrá qué atributo va en qué columna.


El código java

El código completo de la clase de prueba es

package com.chuidiang.ejemplo_apache_pivot;

import java.io.FileInputStream;

import org.apache.pivot.collections.LinkedList;
import org.apache.pivot.collections.List;
import org.apache.pivot.collections.Map;
import org.apache.pivot.wtk.Application;
import org.apache.pivot.wtk.Button;
import org.apache.pivot.wtk.ButtonPressListener;
import org.apache.pivot.wtk.DesktopApplicationContext;
import org.apache.pivot.wtk.Display;
import org.apache.pivot.wtk.PushButton;
import org.apache.pivot.wtk.TableView;
import org.apache.pivot.wtk.Window;
import org.apache.pivot.wtkx.WTKXSerializer;

public class PruebaTableViewApachePivot implements Application
{
    private Window window = null;

    private PushButton botonAnyadir = null;

    private TableView tableView;

    private List <ElDato> lista;

    private int valor = 0;

    private final String nombre = "valor = ";

    public void startup( Display display, Map <String, String> properties)
            throws Exception
    {
        final WTKXSerializer wtkxSerializer = new WTKXSerializer();
        FileInputStream file = new FileInputStream(
                "PruebaTableViewApachePivot.wtkx");
        window = (Window) wtkxSerializer.readObject(file);

        botonAnyadir = (PushButton) wtkxSerializer.get("botonNuevoElemento");
        botonAnyadir.getButtonPressListeners().add(new ButtonPressListener()
        {

            public void buttonPressed( Button button)
            {
                ElDato dato = new ElDato(valor, nombre + valor);
                lista.add(dato);
                tableView.repaint();
                valor++;
            }
        });
        window.open(display);

        tableView = (TableView) wtkxSerializer.get("laTabla");
        lista = new LinkedList <ElDato>();
        tableView.setTableData(lista);
    }

    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(PruebaTableViewApachePivot.class, args);
    }
}

La clase debe heredar de Application, para que Apache Pivot sepa manejarla. En el main hemos llamado a DesktopApplicationContext.main() pasándole de parámetro el class de la clase. En el arranque de la aplicación, Apache Pivot llamará al método startUp(), que debemos definir por implementar Application. En ese método vamos a cargar y visualizar nuestra ventana.

Este trozo

final WTKXSerializer wtkxSerializer = new WTKXSerializer();
FileInputStream file = new FileInputStream(
   "PruebaTableViewApachePivot.wtkx");

nos sirve para cargar el fichero xml con la definición de la ventana. Con las líneas de código

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

visualizamos la ventana. Para darle funcionalidad, debemos por un lada pasarla a la tabla nuestra lista de datos. Para ello, obtenemos el TableView con

tableView = (TableView) wtkxSerializer.get("laTabla");

siendo "laTabla" el wtkx:id que dimos al TableView en el fichero XML. Luego, instanciamos nuestra clase de datos, que será una LinkedList específica de Apache Pivot (no es la LinkedList de java). Realmente puede ser cualquier clase que implemente la interface List de Apache Pivot (no la List de java). Dicha lista de datos hay que pasársela al TableView con el método setTableData().

lista = new LinkedList <ElDato>();
tableView.setTableData(lista);

Y para dar funcionalidad al botón, debemos obtenerlo con

botonAnyadir = (PushButton) wtkxSerializer.get("botonNuevoElemento");

y añadirle un listener con

botonAnyadir.getButtonPressListeners().add(new ButtonPressListener()
{
   public void buttonPressed( Button button)
   {
       ....
   }
});

Dentro de buttonPressed(), que se llamará cada vez que se pulse el botón, sólo debemos crear un nuevo ElDato, meterlo en la lista y decirle al TableView que se repinte. Todo esto son estas líneas de código

ElDato dato = new ElDato(valor, nombre + valor);
lista.add(dato);
tableView.repaint();
valor++;

siendo valor un entero que usamos de contador para que no sean todos los datos iguales. En un ejemplo real, estos datos se obtendrían de una base de datos, un fichero o se pedirían al usuario.