Organizadores Personalizados con Swing

download Organizadores Personalizados con Swing

of 19

Transcript of Organizadores Personalizados con Swing

  • 8/9/2019 Organizadores Personalizados con Swing

    1/19

    Organizadores personalizados

    1

    Resumen: En este trabajo se presenta la secuenciaindicada por el tutorial de Swing (Sun Microsytems)

    para crear organizadores propios al implementar lainterface LayoutManager. Tambin se incluye una

    pequea adaptacin al ejemplo de claseDiagonalLayout de la misma fuente para organizarcomponentes de forma diagonal en la pantalla.

    OrganizadoresPersonalizados con Swing

    Augusto Galicia Lpez

  • 8/9/2019 Organizadores Personalizados con Swing

    2/19

    Tarea 1: Organizadores personalizados

    ndice de contenidoGeneralidades. ........................................................................... 3Tarea. ........................................................................................ 3

    Secuencia para la creacin de un organizador propio. .............. 3Cdigo generado. ...................................................................... 4

    Referencias. ............................................................................... 5

    2

  • 8/9/2019 Organizadores Personalizados con Swing

    3/19

    Organizadores personalizados

    Generalidades.Un manejador de organizacin es un objeto que implementa la interfaz LayoutManager y

    determina el tamao y la posicin de los componentes dentro de un contenedor.

    Tarea.

    Construya un organizador propio. Explique los pasos que sigui y enve el cdigo

    generado.

    Secuencia para la creacin de un organizador propio.

    1.- Crear una clase que implemente la interfaz LayoutManager o implementarla

    directamente. Tambin se puede implementar su subinterfaz LayoutManager2.

    2.- La clase o clases creadas conforme al punto anterior, deben implementar al menos

    los siguientes cinco mtodos, los cuales son requeridos por la interfaz LayoutManager:

    void addLayoutComponent(String, Component)

    void removeLayoutComponent(Component)

    Dimension preferredLayoutSize(Container)

    Dimension minimumLayoutSize(Container)

    void layoutContainer(Container)

    3.- Adems de implementar los cinco mtodos precedentes los organizadores

    generalmente implementan, al menos, un constructor pblico y el mtodo toString().

    4.-Si desea que su organizador maneje restricciones (constraints) de los componentes,

    como tamaos mximos o alineamiento, entonces deber implementarse a la interfaz

    LayoutManager2. De hecho, por estas razones entre muchas otras, casi todos los

    3

  • 8/9/2019 Organizadores Personalizados con Swing

    4/19

    Tarea 1: Organizadores personalizados

    organizadores modernos necesitan implementar dicha interfaz, la cul requiere otros

    cinco mtodos a los requeridos por LayoutManager, que son los siguientes:

    addLayoutComponent(Component, Object)

    getLayoutAlignmentX(Container)

    getLayoutAlignmentY(Container)

    invalidateLayout(Container)

    maximumLayoutSize(Container)

    De estos cinco mtodos, los ms importante son: addLayoutComponent(Component,

    Object) e invalidateLayout(Container).

    5.- Finalmente, el organizador deber mantener referencias a instancias de la clase

    Component que no sean hijas de la clase Container.

    Cdigo generado.

    En los dos archivos java, colocados al final de este documento (AugustoLayout.java y

    DemoDeAugustoLayout.java), los cuales son adaptaciones de los archivos que propone

    el tutorial de Java para el paquete Swing,se observa la secuencia anterior. Las

    adaptaciones consisten en la traduccin y adecuacin del cdigo original, adems de la

    cancelacin de algunas lneas de cdigo que resultaron innecesarias para la

    implementacin de tal organizador. Las adaptaciones y adecuaciones se pueden notar

    al observar los tamaos de archivo, como se muestra en las dos imgenes siguientes:

    4

  • 8/9/2019 Organizadores Personalizados con Swing

    5/19

    Organizadores personalizados

    La pantalla generada por el cdigo del archivo DemoDeAugustoLayout.java es la

    siguiente:

    5

  • 8/9/2019 Organizadores Personalizados con Swing

    6/19

    Tarea 1: Organizadores personalizados

    Referencias.

    http://java.sun.com/docs/books/tutorial/uiswing/layout/custom.html

    6

    http://java.sun.com/docs/books/tutorial/uiswing/layout/custom.htmlhttp://java.sun.com/docs/books/tutorial/uiswing/layout/custom.html
  • 8/9/2019 Organizadores Personalizados con Swing

    7/19

    Organizadores personalizados

    AugustoLayout.java

    /*

    * Este cdigo est basado en el tutorial de Java, por eso

    * al final se incluye el aviso de copyright de Sun Microsystems

    * su aplicacin se muestra en el archivo DemoDeAugustoLayout.java

    */

    import java.awt.*;

    public class AugustoLayout implements LayoutManager

    {

    private int espacioVertical;

    private int AnchoMinimo = 0, AltoMinimo = 0;

    private int anchoPreferido = 0, altoPreferido = 0;

    private boolean tamDesconocido = true;

    int entrada=5;

    public AugustoLayout(int entrada)

    {

    this.entrada=entrada;

    }

    public AugustoLayout()

    { espacioVertical = entrada;

    }

    7

  • 8/9/2019 Organizadores Personalizados con Swing

    8/19

    Tarea 1: Organizadores personalizados

    /* No hace nada, pero la requiere LayoutManager. */

    public void addLayoutComponent(String name, Component comp)

    {

    }

    /* No hace nada, pero la requiere LayoutManager. */

    public void removeLayoutComponent(Component comp)

    {

    }

    //Este mtodo establece el tamao del contenedor

    private void FijarTamano(Container padre)

    {

    int numComponentes = padre.getComponentCount();

    Dimension d = null;

    //Restablecer alto y ancho minimos y preferidos.

    anchoPreferido = 0;

    altoPreferido = 0;

    AnchoMinimo = 0;

    AltoMinimo = 0;

    for (int i = 0; i < numComponentes; i++)

    {

    Component componente = padre.getComponent(i);

    8

  • 8/9/2019 Organizadores Personalizados con Swing

    9/19

    Organizadores personalizados

    if (componente.isVisible()) {

    d = componente.getPreferredSize();

    if (i > 0)

    {

    anchoPreferido += d.width/2;

    altoPreferido += espacioVertical;

    }

    else

    {

    anchoPreferido = d.width;

    }

    altoPreferido += d.height;

    AnchoMinimo =

    Math.max(componente.getMinimumSize().width,AnchoMinimo);

    AltoMinimo = altoPreferido;

    }

    }

    }//Fin del mtodo FijarTamano().

    9

  • 8/9/2019 Organizadores Personalizados con Swing

    10/19

    Tarea 1: Organizadores personalizados

    /* Requerido por LayoutManager. */

    public Dimension preferredLayoutSize(Container padre)

    {

    Dimension dimension= new Dimension(10, 10);

    int numComponentes = padre.getComponentCount();

    FijarTamano(padre);

    //Se agregan las especificaciones preferidas del contenedor

    Insets especificaciones = padre.getInsets();

    dimension.width = anchoPreferido + especificaciones.left + especificaciones.right;

    dimension.height = altoPreferido + especificaciones.top + especificaciones.bottom;

    tamDesconocido = false;

    return dimension;

    }

    /* Required by LayoutManager. */

    public Dimension minimumLayoutSize(Container padre)

    {

    10

  • 8/9/2019 Organizadores Personalizados con Swing

    11/19

    Organizadores personalizados

    Dimension dimension = new Dimension(0, 0);

    int numComponentes = padre.getComponentCount();

    //Se agregan las especificaciones minimas del contenedor

    Insets especificaciones = padre.getInsets();

    dimension.width = AnchoMinimo + especificaciones.left + especificaciones.right;

    dimension.height = AltoMinimo + especificaciones.top + especificaciones.bottom;

    tamDesconocido = false;

    return dimension;

    }

    /* Requerido por LayoutManager. */

    /*

    * Este mtodo establece el tamao del contenedor en la primera vez

    * que se despliega.

    */

    public void layoutContainer(Container padre)

    {

    Insets especificaciones = padre.getInsets();

    11

  • 8/9/2019 Organizadores Personalizados con Swing

    12/19

    Tarea 1: Organizadores personalizados

    int maxWidth = padre.getWidth() - (especificaciones.left + especificaciones.right);

    int maxHeight = padre.getHeight() - (especificaciones.top +

    especificaciones.bottom);

    int numComponentes = padre.getComponentCount();

    int Anchoprevio = 0, Altoprevio = 0;

    int x = 0, y = especificaciones.top;

    int xAjuste = 0, yAjuste = 0;

    boolean unaColumna = false;

    // Se establecen las especificaciones en caso de que no haya minimos o preferidos.

    if (tamDesconocido)

    {

    FijarTamano(padre);

    }

    if (maxWidth

  • 8/9/2019 Organizadores Personalizados con Swing

    13/19

    Organizadores personalizados

    {

    xAjuste = (maxWidth - anchoPreferido)/(numComponentes - 1);

    }

    if (maxHeight > altoPreferido)

    {

    yAjuste = (maxHeight - altoPreferido)/(numComponentes -1);

    }

    for (int i = 0 ; i < numComponentes ; i++)

    {

    Component componente = padre.getComponent(i);

    if (componente.isVisible())

    {

    Dimension dimComponente = componente.getPreferredSize();

    // Si se cambia el tamao de la ventana, se incrementan x e y.

    if (i > 0)

    {

    if (!unaColumna)

    {

    13

  • 8/9/2019 Organizadores Personalizados con Swing

    14/19

    Tarea 1: Organizadores personalizados

    x += Anchoprevio/2 + xAjuste;

    }

    y += Altoprevio + espacioVertical + yAjuste;

    }

    // En caso de que x sea muy grande,

    if ((!unaColumna) && (x + dimComponente.width) > (padre.getWidth() -

    especificaciones.right))

    {

    // Se reduce x a nmero razonable.

    x = padre.getWidth() - especificaciones.bottom -

    dimComponente.width;

    }

    // Establece la posicin y el tamao de los componentes.

    componente.setBounds(x, y, dimComponente.width, dimComponente.height);

    Anchoprevio = dimComponente.width;

    Altoprevio = dimComponente.height;

    }

    14

  • 8/9/2019 Organizadores Personalizados con Swing

    15/19

    Organizadores personalizados

    }

    }

    }

    /*

    * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.

    *

    * Redistribution and use in source and binary forms, with or without

    * modification, are permitted provided that the following conditions

    * are met:

    *

    * - Redistributions of source code must retain the above copyright

    * notice, this list of conditions and the following disclaimer.

    *

    * - Redistributions in binary form must reproduce the above copyright

    * notice, this list of conditions and the following disclaimer in the

    * documentation and/or other materials provided with the distribution.

    *

    * - Neither the name of Sun Microsystems nor the names of its

    * contributors may be used to endorse or promote products derived

    * from this software without specific prior written permission.

    *

    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS

    * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,

    * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

    * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR

    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

    * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

    15

  • 8/9/2019 Organizadores Personalizados con Swing

    16/19

    Tarea 1: Organizadores personalizados

    * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

    * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

    * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    */

    DemoDeAugustoLayout.java

    /*

    * Este Demo requiere a la clase AugustoLayout

    * como est adaptado de los tutoriales de Java

    * al final se incluye el aviso de copyright de Sun Microsystems

    */

    import java.awt.Container;

    import javax.swing.*;

    public class DemoDeAugustoLayout

    {

    public static void AgregarComponentes (Container contenedor)

    {

    contenedor.setLayout(new AugustoLayout());

    contenedor.add(new JLabel("Etiqueta 1"));

    contenedor.add(new JLabel("Etiqueta 2"));

    contenedor.add(new JButton("Botn 1"));

    16

  • 8/9/2019 Organizadores Personalizados con Swing

    17/19

    Organizadores personalizados

    contenedor.add(new JButton("Button 2"));

    contenedor.add(new JButton("Button 3"));

    contenedor.add(new JTextField("textField"));

    contenedor.add(new JLabel("Etiqueta 3"));

    }

    private static void MuestraVentana()

    {

    //Crea la ventana como un nuevo objeto JFrame.

    JFrame Ventana = new JFrame("Demo de AugustoLayout");

    Ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Establece el contenedor.

    AgregarComponentes(Ventana.getContentPane());

    //Muestra la ventana.

    Ventana.pack();

    Ventana.setVisible(true);

    }

    17

  • 8/9/2019 Organizadores Personalizados con Swing

    18/19

    Tarea 1: Organizadores personalizados

    public static void main(String[] args)

    {

    //establece un hilo para el despachador de eventos de Thread:

    SwingUtilities.invokeLater(new Runnable()

    {

    public void run()

    {

    MuestraVentana();

    }

    });

    }

    }

    /*

    * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.

    *

    * Redistribution and use in source and binary forms, with or without

    * modification, are permitted provided that the following conditions

    * are met:

    *

    * - Redistributions of source code must retain the above copyright

    * notice, this list of conditions and the following disclaimer.

    *

    * - Redistributions in binary form must reproduce the above copyright

    18

  • 8/9/2019 Organizadores Personalizados con Swing

    19/19

    Organizadores personalizados

    * notice, this list of conditions and the following disclaimer in the

    * documentation and/or other materials provided with the distribution.

    *

    * - Neither the name of Sun Microsystems nor the names of its

    * contributors may be used to endorse or promote products derived

    * from this software without specific prior written permission.

    *

    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS

    * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,

    * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

    * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR

    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

    * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

    * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

    * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

    * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    */

    19