Componentes Avanzados: JScrollPane y JProgress Bar

Clase JScrollPane

java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JScrollPane

JScrollPane es un contenedor para componentes que necesiten redimensionarse a través una barra deslizable tanto vertical como horizontalmente, el componente no cambian su tamaño original solo lo que se muestra al final en la pantalla. Seguramente todos habremos deslizado miles a lo largo de nuestra experiencia con computadoras, sobretodo en internet. Ejemplo de JScrollPane como contenedor de un JTextArea:

La manera de agregar un componete a un contenedor es siempre la misma y este a su vez necesita ser puesto en otro contenedor o ventana.
Una vez creado el componente y el contenedor JScrollPane la manera de meterlo es con el método setViewPortView(Componente) en lugar de "add":
  • JLabel etiqueta = new JLabel(); //Creamos una etiqueta
  • Icon imagen = new ImageIcon ("src/imagen01.jpg"); //Creamos una IconImage
  • etiqueta.setIcon (imagen); //Ponemos la imagen en la etiqueta
  • JScrollPane scroll = new JScrollPane(); //Creamos el contenedor JScrollane
  • scroll.setViewportView(etiqueta); //Ponemos la etiqueta en el contenedor
  • add(scroll); //agregamos el scroll a otro contenedor o marco


Un Pequeño ejemplo con código:
  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class Barra extends JFrame{
  4.     static JScrollPane panelDeslizable = new JScrollPane();
  5.     static JTextArea areaTexto = new JTextArea(80, 4);
  6.     public Barra(){
  7.         super("Ejemplo Scroll Pane");
  8.         setSize(250,200);
  9.         setLocationRelativeTo(null);
  10.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  11.     // agregando el scrollpane al area de texto
  12.         panelDeslizable.setViewportView(areaTexto);
  13.     // agregando a la ventana el contenedor scrollpane
  14.         add(panelDeslizable,BorderLayout.CENTER);
  15.         setVisible(true);
  16.     }
  17.     public static void main(String[] args) {
  18.         new Barra();
  19.     }
  20. } // Fin de la Clase
El resultado en pantalla será:

Métodos:

  • setViewportView(Component cualquiera)
    • Agregamos al contendor el componente a scrolear.
      • JScrollPane miScrollPane = new JScrollPane();
      • miScrollPane.setViewportView(miComponenteGrande);
  • setComponentOrientation(ComponentOrientation co)
    • Determina la orientacion del componente y con eso la posición(a la derecha o izquierda) de la barra deslizable
    • Los posibles valores de "co" serán:
      • java.awt.ComponentOrientation.LEFT_TO_RIGHT
      • java.awt.ComponentOrientation.RIGHT_TO_LEFT
      • java.awt.ComponentOrientation.UNKNOWN
  • setVerticalScrollBarPolicy(int policy)
    • Determina como se visualiza la barra deslizable vertical
    • Los posible valores del entero "policy" son:
      • JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
      • JScrollPane.VERTICAL_SCROLLBAR_NEVER
      • JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
  • setHorizontalScrollBarPolicy(int policy)
    • igual al anterior pero con la barra horizontal
    • Los posible valores del entero "policy" son:
      • JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
      • JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
      • JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED

Todos los demás constructores, atributos y métodos en la documentación oficial de java aquí.


Clase JProgressBar

java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JProgressBar

La clase JProgressBar nos trae una barra de progreso, el problema de este componente Swing es que es necesario entender como funcionan un poquito los "Hilos" o "Thread" (en inglés) que permite que la aplicación ejecute varias tareas en simultaneo como para ir teniendo una idea...
Una barra de progreso se ve asi si es determinada:
O si el progreso no está definido puede ser del tipo indeterminado:
Veamos con el siguiente ejemplo.
  1. La barra de progreso tiene que ser activada a partir de un momento (puede ser desde el inicio mismo de la aplicación) obtaremos por que sea a través de un boton.
  2. Este boton tiene que estar vigilado por un "Escuchante" para saber cuando se produce el evento.
  3. Y dentro de las operaciones del mismo evento crearemos un nuevo objeto de la clase Thread (un nuevo hilo) y lo empezamos a hacer que ejecute sus operaciones con el método start que a partir de ese instante el hilo estara funcionando.
  4. Como parametro del nuevo hilo llamaremos al constructor de otra clase que crearemos y llamaremos "Hilo"
  5. Esta pequeña clase es hija de Runnable ya que sobreescribiremos el método de esta interface llamado run().
  6. Dentro del método "correr", que ejecutara cosas, se darña un loop for, de 0 a 100 coincidiendo con los valores mínimos y máximos de la barra de progreso y se irá incrementando de 1 en 1.
  7. Para lo cual en cada incremento se volvera a configurar el valor de la barra con el método setValue(int n), se vuelve a mostrar en pantalla con el valor actualizado con el método rePaint()
  8. Por último pero no menos importante, dentro de un bloque try-cath porque se generarám excepciones, haremos que el hilo(Thread) descanse su ejecución unos milisegundo específicos pero el progreso será constante.

Código:

  1. import javax.swing.*;
  2. import java.awt.event.*;
  3.  
  4. public class Progreso {
  5.     static JFrame marco = new JFrame("Barra de progreso");
  6.     static JPanel panel = new JPanel();
  7.     static JButton pulsame = new JButton("Pulsame!");
  8.     static JButton salir = new JButton("Cerrar");
  9.     static JProgressBar barra = new JProgressBar(0, 100);//indicamos valor minimo y maximo
  10.  
  11.     public static void main (String[] args){
  12.  
  13.         marco.setSize(300, 100);
  14.         marco.setResizable(false); //no permite cambiar el tamaño de la ventana
  15.         marco.setLocationRelativeTo(null); //aparece en el centro de la pantalla
  16.         marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  17.        
  18.         barra.setBounds(5, 10, 280, 25); //configura posicion x, posicion y
  19.         pulsame.setBounds(5, 40, 140, 25); // ancho y alto
  20.         salir.setBounds(150, 40, 140, 25);
  21.        
  22.         barra.setStringPainted(true); //Agrega el porcentaje en la barra
  23.         pulsame.addActionListener(new Pulsar());
  24.         salir.addActionListener(new Salir());
  25.        
  26.         panel.setLayout(null); //no aplicamos un gestor de diseño, los componentes tienen su propio lugar determinado, por defecto es flowlayout
  27.         panel.add(barra);
  28.         panel.add(pulsame);
  29.         panel.add(salir);
  30.         marco.add(panel);
  31.        
  32.         marco.setVisible(true);
  33.     }
  34.  
  35. public static class Pulsar implements ActionListener{
  36.     @Override
  37.     public void actionPerformed (ActionEvent e){
  38.         new Thread(new Hilo()).start();
  39.         pulsame.setEnabled(false);
  40.     }
  41.     }
  42. public static class Salir implements ActionListener{
  43.     @Override
  44.     public void actionPerformed (ActionEvent e){
  45.         System.exit(0);
  46.     }
  47. }
  48.  
  49. public static class Hilo implements Runnable{
  50.     @Override
  51.     public void run(){
  52.         for (int i=0; i<=100; i++){
  53.             barra.setValue(i); //cambia el estado de la barra en i unidades
  54.             barra.repaint(); //"repinta" el estado de la barra a el actual
  55.             try{
  56.                 Thread.sleep(50); //relentiza el hilo 50 milisegundos
  57.             } catch (InterruptedException e){}
  58.         }
  59.     }
  60.     }
  61. }

Resultado en pantalla:


Mètodos:

  • setIndeterminate(boolean newValue)
    • Determina si se trata de una barra indeterminada haciendolo true.
  • setMaximum(int n)
    • configura el valor máximo
  • setMinimum(int n)
    • configura el valor mínimo
  • setStringPainted(boolean b)
    • muestra el valor expresado en numeros dentro de la misma barra
  • setValue(int n)
    • configura el valor de la barra de progreso

No hay comentarios:

Publicar un comentario