## Cómo Utilizar la Clase Scrollbar

Las barras de desplazamiento tienen dos usos:

- Una barra de desplazamiento puede actuar como un deslizador que el usuario manipula para seleccionar un valor. Un ejemplo de esto está en el programa Converter de la página La Anatomía de un Programa basado en GUI.
- Las barras de desplazamiento le pueden ayudar a mostrar una parte de una región que es demasiado grande para el área de dibujo. Las barras de desplazamiento le permiten al usuario elegir exactamente la parte de la región que es visible. Aquí tiene un ejemplo (podría tardar un poco en cargarse la imagen):

Para crear una barra de desplazamiento, necesitas crear un ejemplar de la clase Scrollbar. También se pueden inicializar los siguientes valores, o bien especificándolos al Constructor de Scrollbar o llamando al método setValues() antes de que la barra de desplazamiento sea visible.

int orientation
  Indica si la barra de desplazamiento debe ser vertical u horizontal. Especificado con Scrollbar.HORIZONTAL o Scrollbar.VERTICAL.

int value
  El valor inicial de la barra de desplazamiento. Para barras de desplazamiento que controlan un área desplazable, esto significa el valor x (para las barras horizontales, o el valor y (para las verticales) de la parte del área que es visible cuando el usuario la visita por primera vez. Por ejemplo, el applet anterior arranca en las posiciones 0 tanto vertical como horizontal y la porción de imagen representada empieza en (0,0).

int visible
  El tamaño en pixels de la porción visible del área desplazable. Este valor, si se selecciona antes de que la barra de desplazamiento sea visible, determina cuantos pixels se desplazará la imagen con una pulsación en la barra de desplazamiento (pero no en el botón). Seleccionar este valor después de que la barra de desplazamiento sea visible no tiene ningún efecto.Después de que la barra de desplazamiento sea visible, se debería utilizar el método setPageIncrement() para obtener el mismo efecto.

int minimum
  El valor mínimo que puede tener la barra de desplazamiento. Para barras de desplazamiento que controlan áreas desplazables este valor normalmente es 0 (la parte superior izquierda del área).

int maximum
  El valor máximo que puede tener la barra de desplazamiento. Para barras de desplazamiento que controlan áreas desplazables este valor normalmente es:(la anchura o altura total , en pixels, del componente que está siendo parcialmente representada) - (la anchura o altura visible actualmente del área desplazable).

Aquí tienes el código del applet anterior. Este código define dos clases. La primera es una sencilla subclase de Canvas (ScrollableCanvas) que dibuja una imagen. La segunda es una subclase de Panel (ImageScroller, que realmente desciende de Applet) que crea y conteniene un ScrollableCanvas y dos Scrollbars. Este programa ilustra unos pocos detalles importantes sobre el manejo de un área despalzable:

- El manejo de eventos para una barra de desplazamiento es bastante sencillo. El progama solo debe responder a los eventos de desplazamiento guardando los nuevos valores de la barra de desplazamiento en un lugar accesible para que el componente pueda mostrarse dentro del área desplazable, y luego llamar al método repaint() del Componente.

      public boolean handleEvent(Event evt) {
          switch (evt.id) {
            case Event.SCROLL_LINE_UP:
            case Event.SCROLL_LINE_DOWN:
            case Event.SCROLL_PAGE_UP:
            case Event.SCROLL_PAGE_DOWN:
            case Event.SCROLL_ABSOLUTE:
              if (evt.target == vert) {
                  canvas.ty = ((Integer)evt.arg).intValue();
                  canvas.repaint();
              }
              if (evt.target == horz) {
                  canvas.tx = ((Integer)evt.arg).intValue();
                  canvas.repaint();
              }
          }
          return super.handleEvent(evt);
      }

- El Componente que se muestra a sí mismo dentro de un área desplazable puede ser muy sencillo. Todo lo que necesita es dibujarse a sí mismo en el origen especificado por los valores de sus barras de desplazamiento. Un Componente puede cambiar su origen (y así no tener que cambiar su código de dibujo normal), poniéndo el siguiente código al principio de sus métodos paint() o update():

      g.translate(-tx, -ty);

- Cuando ocurre el desplazamiento, probablemente notarás parpadeo en el área de display, Si no se quiere que esto ocurra, se necesita implementar el método update() en el componente representado, y posiblemente también el doble buffer. Cómo hacer esto se explica en la página Eliminar el Parpadeo.

- Si el área desplazable puede redimensionarse, cuidado con un problema cómun del desplazamiento. Ocurre cuando el usuario desplaza el área hacia abajo y la derecha y luego agranda el área. Si no se tiene cuidado, el ára mostrará un espacio en blanco en su parte inferior derecha. Después de que el usuario desplace y vuelve a la parte inferior derecha, el espacio en blanco no está más allí. Para evitar mostrar un espacio en blanco innecesario, cuando el área desplazable se agranda debe desplazar también el origen del Componente para aprovechar el nuevo espacio disponible. Aquí tienes un ejemplo:

      int canvasWidth = canvas.size().width;

      //Desplaza todo a la derecha si se está mostrando un espacio vacío
      //en el lado derecho.
      if ((canvas.tx + canvasWidth) > imageSize.width) {
          int newtx = imageSize.width - canvasWidth;
          if (newtx < 0) {
                      newtx = 0;

          }
          canvas.tx = newtx;

      }

Ozito