Tutorial de Java

Escalas y Barras de Progreso

Anterior | Siguiente

Una escala permite al usuario introducir datos desplazando el marcador de la escala hacia un lado o hacia otro, lo cual resulta altamente intuitivo en algunos casos; como pueden ser, por ejemplo, controles de volumen. Una barra de progreso presenta al usuario información en forma de una barra parcialmente llena, o parcialmente vacía, para que pueda tener una perspectiva visual de los datos. El ejemplo java1413.java, muestra los dos objetos en consonancia, de tal forma que desplazando la escala hacia un lado o hacia otro, la barra de progreso sigue el camino marcado por esos desplazamientos.La figura anterior corresponde a la ejecución del programa, en donde se observa que la barra se ha desplazado al unísono que la escala, correspondiéndose en espacio.

import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;

public class java1413 extends JPanel {
  JProgressBar barraProg = new JProgressBar();
  JSlider barraSlid = new JSlider( JSlider.HORIZONTAL,0,100,60 );

  public java1413() {
    setLayout( new GridLayout(2,1) );
    add( barraProg );
    barraSlid.setValue( 0 );
    barraSlid.setPaintTicks( true );
    barraSlid.setMajorTickSpacing( 20 );
    barraSlid.setMinorTickSpacing( 5 );
    barraSlid.setBorder( new TitledBorder("Desplazame") );
    barraSlid.addChangeListener( new ChangeListener() {
      public void stateChanged( ChangeEvent evt ) {
        barraProg.setValue(barraSlid.getValue() );
      }
    } );
    add( barraSlid );
  }

  public static void main( String args[] ) {
    JFrame frame = new JFrame( "Tutorial de Java, Swing" );
    frame.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent evt ) {
        System.exit( 0 );
      }
    } );
    frame.getContentPane().add( new java1413(),BorderLayout.CENTER );
    frame.setSize( 200,150 );
    frame.setVisible( true );
  }
}

La barra de progreso es muy simple de controlar, pero el objeto JSlider tiene una tremenda cantidad de opciones, que van desde la orientación hasta que las marcas sean más o menos grandes. Sin embargo, es sumamente sencillo, como se puede comprobar, incorporar un borde con título.

El ejemplo java1428.java, es autónomo y lo que hace es crear un thread, cuando se pulsa el botón Arrancar, que va presentando en el campo de texto un número de 0 a 100, y va rellenado la barra de progreso, para indicar la carga, o el tanto por ciento de completitud que se lleva. La imagen siguiente muestra el ejemplo en pleno funcionamiento.

En el código solamente destacar la presencia de la clase anidada, que es la encargada de la actualización de la información, tanto de forma numérica en el campo de texto como de forma gráfico en la barra de progreso.

import java.lang.*;
import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;

public class java1428 extends JPanel {
  Thread hilo;
  Object objeto = new Object();
  boolean pideParar = false;
  JTextField texto;
  JProgressBar barra;
  
  public java1428() {
    setLayout( new BorderLayout() );
    
    texto = new JTextField();
    add( texto,BorderLayout.NORTH );
    
    JPanel panelInferior = new JPanel();
    barra = new JProgressBar();
    panelInferior.setLayout( new GridLayout(0,1) );
    panelInferior.add( barra );
    panelInferior.add( new JLabel( "Cargando..." ) );

    JPanel panelBotones = new JPanel();
    JButton botonArranque = new JButton( "Arrancar" );
    botonArranque.setBackground( SystemColor.control );
    panelBotones.add( botonArranque );
    botonArranque.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent evt ) {
	iniciaCuenta();
      }
    } );
    
    JButton botonParar = new JButton( "Parar" );
    botonParar.setBackground( SystemColor.control );
    panelBotones.add( botonParar );
    botonParar.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent evt ) {
	detieneCuenta();
      }
    } );
    
    panelInferior.add( panelBotones );
    add( panelInferior,BorderLayout.SOUTH );
  } 
    
  public void iniciaCuenta() {
    if( hilo == null ) {
      hilo = new ThreadCarga();
      pideParar = false;
      hilo.start();
    }
  }
    
  public void detieneCuenta() {
    synchronized( objeto ) {
      pideParar = true;
      objeto.notify();
    }
  } 

    
  class ThreadCarga extends Thread {
    public void run() {
      int min = 0;
      int max = 100;

      barra.setValue( min );
      barra.setMinimum( min );
      barra.setMaximum( max );

      for (int i=min; i <= max; i++ ) {
	barra.setValue( i );
	texto.setText( ""+i );
	synchronized( objeto ) {
	  if( pideParar )
	    break;
	  try {
	    objeto.wait( 100 );
	  } catch( InterruptedException e ) {
	    // Se ignoran las excepciones
	  }
	}
      }
      hilo = null;
    }
  }
  
  public static void main( String args[] ) {
    JFrame frame = new JFrame( "Tutorial de Java, Swing" );
    
    frame.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent evt ) {
	System.exit( 0 );
      }
    });
    
    frame.getContentPane().add( new java1428(),BorderLayout.CENTER );
    frame.setSize( 400,150 );
    frame.setVisible( true );
  }
}

Navegador

Home | Anterior | Siguiente | Indice | Correo