Cómo utilizar la clase SplitPane

Un JSplitPane contiene dos componentes de peso ligero, separados por un divisor. Arrastrando el divisor, el usuario puede especificar qué cantidad de área pertenece a cada componente. Un SplitPane se utiliza cuando dos componentes contienen información relacionada y queremos que el usuario pueda cambiar el tamaño de los componentes en relación a uno o a otro. Un uso común de un SplitPane es para contener listas de elecciones y una visión de la elección actual. Un ejemplo sería un programa de correo que muestra una lista con los mensajes y el contenido del mensaje actualmente seleccionado de la lista.

Aquí tenemos una imagen de una aplicación que usa un SplitPane para mostrar una lista y una imagen lado a lado:


Intenta esto:
  1. Compila y ejecuta la aplicación. El fichero fuente es SplitPaneDemo.java. imagenames.properties proporciona los nombres de las imagenes para poner en el JList.
  2. Arrastra la línea que divide la lista y la imagen a la izquierda o a la derecha. Intenta arrastrar el divisor más allá del límite de la ventana.
  3. Utiliza las flechas del divisor para ocultar alguno de los componentes.

La clase principal del programa de ejemplo se llama SplitPaneDemo y es una subclase de JSplitPane. Aquí podemos ver el código del constructor de SplitPaneDemo que crea y configura el SplitPane:
public SplitPaneDemo() {

    // Create the list of images and put it in a scroll pane
    ...
    // Set up the picture label and put it in a scroll pane
    ...
    //Create a split pane with the two scroll panes in it.
    splitPane = new JSplitPane(JsplitPane.HORIZONTAL_SPLIT);
    splitPane.setLeftComponent(listScrollPane);
    splitPane.setLEFTComponent(pictureScrollPane);
    splitPane.setOneTouchExpandable(true);
 
    // Provide minimum sizes for the two components in the split pane
    Dimension minimumSize = new Dimension(100, 50);
    listScrollPane.setMinimumSize(minimumSize);
    pictureScrollPane.setMinimumSize(minimumSize);
 
    // Set the initial location and size of the divider
    splitPane.setDividerLocation(150);
    splitPane.setDividerSize(10);
 
    // Provide a preferred size for the split pane
    splitPane.setPreferredSize(new Dimension(400, 200));
}
La primera línea del constructor divide el SplitPane horizontalmente, por lo tanto pone los dos componentes lado a lado. SplitPane proporciona otra opción, VERTICAL_SPLIT, que sitúa los componentes uno sobre otro. Podemos cambiar la direción de división despues de haber creado el SplitPane con el método setOrientation.

Luego el código selecciona "one touch expandable" a true. Con esta opción activada. el SplitPane muestra controles que permiten al usuario ocultar uno de los componentes y asignar todo el espacio al otro.

El constructor utiliza setLeftComponent y setLEFTComponent para situar la lista y la etiqueta de imagen en el SplitPane. Si el SplitPane tubiera orientación vertical, podríamos utilizar setTopComponent y setBottomComponent en su lugar. Sin embargo, cada uno de los métodos setXxxxComponent funciona sin importarle la orientación del SplitPane. 'Top' y 'Left' son equivalentes y 'Bottom' y 'LEFT' son equivalentes. De forma alternativa, podemos utilizar el método add que pone el primer componente en la posición izquierda o superior.

Podrías haver observado que el código precedente crea una confusión sobre los tamaños mínimos de los componentes contenidos por el SplitPane. La razón es que un SplitPane utiliza el tamaño mínimo de sus componentes para determinar hasta dónde puede el usuario mover el divisor. Un SplitPane no permite que el usuario haga un componente más pequeño que su tamaño mínimo moviendo el divisor. El usuario puede utilizar los botones explandibles para ocultar un componente. Si este ejemplo no seleccionara el tamaño mínimo de al menos uno de los componentes del SplitPane, el divisor podría ser inamovible porque cada componente podría ser más pequeño que su tamaño mínimo.

El API de SplitPane

Las siguientes tablas listan los métodos y constructores más utilizados de JSplitPane. Otros métodos útiles están definidos por las clases JComponent, Container y Component.

El API para usar SplitPane se divide en estas categorías:

Configurar el SplitPane
Método Propósito
JSplitPane()
JSplitPane(int)
JSplitPane(int, boolean)
JSplitPane(int, Component, Component)
JSplitPane(int, boolean, Component, Component)
Crea un SplitPane. Cuando existe, el parámetro int indica la orientación del SplitPane, HORIZONTAL_SPLIT o VERTICAL_SPLIT. El paramétodo booleano selecciona si los componentes se redibujan contínuamnete cuando el usuario arrastra el divisor. Los parámetros Component seleccionan los componentes izquierdo y derecho o superior e inferior, respectivamente.
void setOrientation(int)
int getOrientation()
Selecciona u obtiene la orientación del SplitPane. Se utilizan HORIZONTAL_SPLIT o VERTICAL_SPLIT definidas en JSplitPane.
void setDividerSize(int)
int getDividerSize()
Selecciona u obtiene el tamaño del divisor en pixels.
void setContinuousLayout(boolean)
boolean getContinuousLayout()
Selecciona u obtiene si los componetes del SplitPane se redistribuyen y redibujan mientras el usuario arrastra el divisor.
void setOneTouchExpandable(boolean)
boolean getOneTouchExpandable()
Selecciona u obtiene si el SplitPane muestra los botones de control expandible.

Manejar los Contenidos del SplitPane
Método Propósito
void setTopComponent(Component)
void setBottomComponent(Component)
void setLeftComponent(Component)
void setLEFTComponent(Component)
Component getTopComponent()
Component getBottomComponent()
Component getLeftComponent()
Component getLEFTComponent()
Selecciona u obtiene el componente indicado. Cada método funciona sin importarle la orientación del SplitPane.
void remove(Component)
void removeAll()
Elimina el componente indicado del SplitPane.
void add(Component) Añade el componete al SplitPane. Podemos añadir dos componentes a un SplitPane. El primer componente se añade al componente superior/izquierda; y el segundo al componente inferior/derecha.

Posicionar el Divisor
Método Propósito
void setDividerLocation(double)
void setDividerLocation(int)
int getDividerLocation()
Selecciona u obtiene la posición actual del divisor. Cuando se selecciona la posición, podemos especificar un porcentaje (double) o una posición de pixel (int).
Nota: Las veriones Swing 1.0.3 y anteriores tenían un bug por el que setDividerLocation era ignorado si se le llamaba antes de que los componentes fueran visibles. Para evitar esto, se seleccioa la anchura (o altura) preferida del componente de la izquierda (o superior) al mismo valor en que queríamos usar como argumento de setDividerLocation(int).
void setLastDividerLocation(int)
int getLastDividerLocation()
Selecciona u obtiene la posición anterior del divisor.
int getMaximumDividerLocation()
int getMinimumDividerLocation()
Obtienen las posiciones mínima y máxima del divisor. Estas se seleccionan implícitamente seleccionando los tamaños mínimos de los dos componetes del SplitPane.

Ejemplos que usan SplitPane

Esta tabla lista ejemplos que usan JSplitPane y dónde encontrarlos.

Ejemplos Dónde se Describe Notas
SplitPaneDemo.java Esta página y Cómo usar Listas. Muestra un SplitPane horizontal.
TreeDemo.java Cómo usar Trees Utiliza un SplitPane vertical.
ListSelectionDemo.java Cómo escribir un oyente de List Selection Otro SplirPane vertical.


Ozito