Você está na página 1de 85

NetBeans IDE 5.

5: GUA RPIDA (Continuacin)


Flujos de entrada-salida y visualizacin cientfica de datos
Autor: Fsico, M Sc., Diego Luis Aristizbal Ramrez, profesor asociado, Escuela de Fsica, UN. Universidad Nacional de Colombia sede Medelln Copyright 2007

Bienvenido a NetBeans IDE!


A continuacin se implementarn tres aplicaciones en las que implica leer datos de archivos planos para luego desplegar su visualizacin. En la primera se visualizarn los espectros de los elementos como se ilustra en la siguiente figura,

En la segunda se visualizar diferentes charts empleando el paquete JFreeChart el cual es software libre. La figura siguiente ilustra varias pantallas de la aplicacin en ejecucin.

En la tercera se visualizar el siguiente sitio Web,

diferentes representaciones grficas usando el paquete

VisAD (Visualization for Algorithm Development) cuyo tutorial se puede encontrar en http://www.ssec.wisc.edu/~billh/tutorial/index.html La figura siguiente ilustra varias pantallas de esta ltima aplicacin en ejecucin.

I. Visualizacin de espectros
Empezar la aplicacin Paso 1: Ejecutar el IDE NetBeans 5.5. Seleccionar en la barra de men, File > New Project En la ventana que se despliega, seleccionar General > Java Application y se desplegar la siguiente ventana,

Escribir en el nombre del proyecto, EjemploEspectros y en la localizacin del proyecto elegir la carpeta donde se almacenar. Tngase en cuenta que aunque la aplicacin ser en contexto grfico, la clase principal no se tomar en este contexto, por lo que no se desactivarn las opciones Set as Main Project y Create Main Class. En el campo de texto Create Main Class, escribir AplicacionEspectros. Presionar el botn Finish. El panel Projects tendr la siguiente forma,

Paso2: Agregar el siguiente cdigo en rojo en clase principal, AplicacionEspectros.java


public class AplicacionEspectros { /** Creates a new instance of AplicacionEspectros */ public AplicacionEspectros() { } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here new AplicacionEspectros(); } }

Lectura de los datos Los datos de los espectros a visualizar se encuentran en un documento plano denominado datos_espectros.txt.

Paso 3: Ubique este documento en el directorio donde almacena su proyecto. Un vistazo al directorio del proyecto mostrar algo parecido a la siguiente imagen.

Paso 4: Crear la clase que almacena los datos en memoria. Ubicar el cursor en Source Packages del rbol de Projects, hacer clic y seleccionar new > Java Package En la ventana desplegada escriba datos como nombre del paquete y presionar el botn Finish. El aspecto del panel Projects es ahora el siguiente,

Ubicar ahora el cursor en datos del rbol de Projects, hacer clic y seleccionar new > Java Class En la ventana desplegada escriba DatosEspectros como nombre de la clase y presionar el botn Finish. El aspecto del panel Projects es ahora el siguiente,

En el cdigo de la clase generada agregar el siguiente cdigo en rojo,


package datos; import java.util.*; public public public public class DatosEspectros { static Vector longitudes_onda=new Vector(); static Vector intensidad=new Vector(); static Vector nombre_elemento=new Vector();

/** Creates a new instance of Datos */ public DatosEspectros() { } }

Para leer los datos del archivo se deben emplear las tcnicas de flujos de datos en java. A continuacin se implementar el cdigo que leer los datos del archivo plano y los almacenar en la clase Datos. Paso 5: Agregar el siguiente cdigo en rojo en la clase principal ,

AplicacionEspectros.java,
import datos.DatosEspectros; import java.io.*; public class AplicacionEspectros { /** Creates a new instance of AplicacionEspectros */ public AplicacionEspectros() { leerDatosEspectros(); } private void leerDatosEspectros(){ try {

//Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("datos_espectros.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en DatosEspectros StreamTokenizer streamtokenizer = new StreamTokenizer(text); //cargar los datos en la clase DatosEspectros.java String nombre_elemento=""; while(nombre_elemento.equals("End")==false){ streamtokenizer.nextToken(); nombre_elemento = streamtokenizer.sval; DatosEspectros.nombre_elemento.addElement(nombre_elemento); streamtokenizer.nextToken(); double longitud_onda = streamtokenizer.nval; DatosEspectros.longitudes_onda.addElement( new Double(longitud_onda)); streamtokenizer.nextToken(); int intensidad = (int)streamtokenizer.nval; DatosEspectros.intensidad.addElement(new Double(intensidad)); //5. Cerrar el canal text.close(); } catch(IOException ioexception){} } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here new AplicacionEspectros(); } } }

Implementacin del visualizador de los datos del espectro en una tabla. Paso 6: Crear el paquete visualizadores de tal forma que el rbol de Projects quede con la siguiente apariencia,

Paso 7: Ubicar el cursor en visualizadores del rbol de Projects hacer clic y seleccionar new > Java Frame FormEn la En la ventana desplegada escriba TablaEspectros como nombre de la clase y presionar el botn Finish. El aspecto del panel Projects es ahora el siguiente,

Observar que sta ltima clase est en contexto grfico. Paso 8: Agregar a TablaEspectros un men. En el panel Inspector crear el siguiente rbol,

Ubicar el cursor en jMenu_archivo y hacer clic derecho y escoger Properties. Escribir en Label Archivo. Hacer lo mismo para JMenu_visualizar para escribir Visualizar. Ubicar el cursor en jMenuItem_leer y hacer clic derecho y escoger Properties. Escribir en Text Leer Archivo. Hacer lo mismo para JMenuItem_salir para escribir Salir y en jMenuItem_visualizar_espectros para escribir Visualizar espectros. Paso 9: Agregar a TablaEspectros una tabla que despliegue os datos de los espectros de los elemento. Ubicar el cursor en JFrame del rbol de Inspector hacer clic derecho y seleccionar Set Layout > BoxLayout. De nuevo ubicar el cursor en Jrame y seleccionar Ad From Palette > Swing > JTable. Cambie el nombre de la variable de la jTable_espectros. El aspecto del rbol de Inspector ser ahora el siguiente,

Y el aspecto del panel Design es ahora,

Cambiar las propiedades de la tabla Paso 10:

10

Ubicar el cursor en jTable_espectros del rbol de Inspector y hacer clic y escoge en el popmen desplegado Properties y se desplegar la siguiente ventana de propiedades. Escoger Model y cambiar los valores en la ventana desplegada tal y como se ulstra en la siguiente figura y presionar ok.

El aspecto del panel Design ser ahora el siguiente,

11

Completar el cdigo de la clase TablaEspectros.java Paso 11: Agrgear el siguiente cdigo en rojo a TablaEspectros.java
package visualizadores; import datos.DatosEspectros; import javax.swing.table.*; public class TablaEspectros extends javax.swing.JFrame { /** Creates new form TablaEspectros */ public TablaEspectros() { initComponents(); } private void cargarValores(){ for (int i=0;i<DatosEspectros.nombre_elemento.size();i++){ //agregar fila dinmicamente String nombre= (String)DatosEspectros.nombre_elemento.elementAt(i); Double valor_longitud_onda=(Double)DatosEspectros.longitudes_onda.elementAt(i); Double valor_intensidad=(Double)DatosEspectros.intensidad.elementAt(i); Object[] datos=new Object[3]; datos[0]=nombre; datos[1]=valor_longitud_onda; datos[2]=valor_intensidad; DefaultTableModel model = (DefaultTableModel)jTable_espectros.getModel(); model.addRow(datos); } } activarItemes();

private void activarItemes(){ jMenuItem_leer.setEnabled(false); jMenuItem_visualizar_espectros.setEnabled(true); }

Paso 12: Eventos de los tems del men Ubicar el cursor en el rbol de inspector en jMenuItem_leer y hacer clic derecho. Selecconar Events > Action > actionPerformed y en la regin dode queda sumergido el cursor agregar el siguiente cdigo en rojo,
private void jMenuItem_leerActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: cargarValores(); }

Repetir para jMenuItem_salir,


private void jMenuItem_salirActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: System.exit(0); }

Paso 13: Agregar ms cdigo a la clase principal AplicacionEspectros.java Agrear el siguiente cdigo en rojo a la clas AplicacionEspectros.java,
import datos.DatosEspectros; import java.io.*; import visualizadores.*;

12

public class AplicacionEspectros { private TablaEspectros tabla;

/** Creates a new instance of AplicacionEspectros */ public AplicacionEspectros() { leerDatosEspectros(); tabla=new TablaEspectros(); customizarTabla(); } private void customizarTabla(){ //Ttulo tabla.setTitle("Espectros de los elementos"); //Tamao tabla.setSize(500,500); tabla.setResizable(false); //Visible tabla.setVisible(true); } private void leerDatosEspectros(){ try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("datos_espectros.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en DatosEspectros StreamTokenizer streamtokenizer = new StreamTokenizer(text); //cargar los datos en la clase DatosEspectros.java String nombre_elemento=""; while(nombre_elemento.equals("End")==false){ streamtokenizer.nextToken(); nombre_elemento = streamtokenizer.sval; DatosEspectros.nombre_elemento.addElement(nombre_elemento); streamtokenizer.nextToken(); double longitud_onda = streamtokenizer.nval; DatosEspectros.longitudes_onda.addElement( new Double(longitud_onda)); streamtokenizer.nextToken(); int intensidad = (int)streamtokenizer.nval; DatosEspectros.intensidad.addElement(new Double(intensidad)); } //5.Cerrar el canal text.close(); } catch(IOException ioexception){} } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here new AplicacionEspectros(); }

13

Compilar y ejecutar. Hacer clic en el item Abrir archivo del men Archivo. Se debera desplegar lo siguiente,

Felicitaciones. Ya sabes el procedimiento para leer datos de un texto plano y desplegarlos en una tabla. FELICITACIONES: ESTO ES UN GRAN AVANCE que te permitir desarrollar software muy til en los laboratorios y aplicaciones en ingeniera! Visualizacin en pseudocolor de los espectros de emisin y absorcin de los espectros de los elementos. Implementacin de las clases responsables de dibujar las lneas espectrales Paso 14: Crear el paquete espectros con las clases EspectroLuzBlanca.java, EspectroSolra.java y EspectroElemento.java. El panel Projects deber quedar de la siguiente forma,

14

Estas clase se disearon empelando la propiedad dew Herencia de la programacin orientada a objetos:

Paso 15: Agregar a cada una de estas clases el cdigo en rojo, EspectroLuzBlnaca.java
package espectros; import javax.swing.*; import java.awt.*; import java.awt.geom.*; import java.util.*; import java.awt.event.*; public class EspectroLuzBlanca extends JComponent MouseListener { implements MouseMotionListener,

15

//variables protected int ancho; protected int largo; private int alto; //desplegar cadena protected boolean desplegar_cadena=false; protected int posicion_x_cadena,posicion_y_cadena; protected double lectura,incertidumbre; protected double longitud_onda; protected double posicion; protected Graphics2D g2; protected boolean on=true; /** Creates a new instance of EspectroLuzBlanca */ public EspectroLuzBlanca() { //tamao preferido this.setPreferredSize(new Dimension(100,20)); this.addMouseListener(this); this.addMouseMotionListener(this); } //Eventos del ratn public void mouseClicked(MouseEvent mouseevent) { } public void mouseDragged(MouseEvent mouseevent) { } public void mouseEntered(MouseEvent mouseevent) { } public void mouseExited(MouseEvent mouseevent) { desplegar_cadena=false; repaint(); } public void mouseMoved(MouseEvent mouseevent) { desplegar_cadena=true; posicion_x_cadena=mouseevent.getX(); /*clculo de longitud de onda equivalente sobre la pantalla y su incertidumbre en la representacin en la pantalla */ //valor del pixel en intervalo de longitud de onda incertidumbre=(6900.0-4200.0)/(double)largo; lectura=4200.0+(largo-posicion_x_cadena)*incertidumbre; repaint(); } public void mousePressed(MouseEvent mouseevent) { } public void mouseReleased(MouseEvent mouseevent) { } protected void calcular_posicion_linea(){ posicion=((longitud_onda-4200)*largo)/(6900-4200); } //dibujar espectro

16

public void paintComponent(Graphics g) { //clculos necesarios para dibujar ancho=(int)(0.2*getWidth()); largo = 5*ancho; //Contexto grfico en java 2 g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); //680 nm a 600 nm GradientPaint rojo_a_naranga = new GradientPaint(0,0,new Color(255,0,0),(int)(0.44*largo), 0,new Color(255,255,0));//255,188,0 g2.setPaint(rojo_a_naranga); g2.fill (new Rectangle2D.Double(0,0,0.44*largo,ancho)); //600 nm a 580 nm GradientPaint naranja_a_verde = new GradientPaint((int)(0.44*largo),0,new Color(255,255,0), (int)(0.55*largo),0,new Color(0,255,0)); g2.setPaint(naranja_a_verde); g2.fill (new Rectangle2D.Double(0.44*largo,0,0.11*largo,ancho)); //580 nm a 480 nm GradientPaint verde_a_cyan = new GradientPaint((int)(0.55*largo),0,new Color(0,255,0),(int) (0.75*largo), 0,new Color(128,255,255)); g2.setPaint(verde_a_cyan); g2.fill (new Rectangle2D.Double(0.55*largo,0,0.20*largo,ancho)); //400 nm a 390 nm GradientPaint cyan_a_azul = new GradientPaint((int)(0.75*largo),0,new Color(128,255,255), (int)(largo), 0,new Color(166,84,254)); g2.setPaint(cyan_a_azul); g2.fill (new Rectangle2D.Double(0.75*largo,0,0.25*largo,ancho)); //despliegue de la lectura if(desplegar_cadena==true&&on==true){ g2.setPaint(new Color(255,255,0,160)); g2.fillRect(posicion_x_cadena,0,60,12); g2.setPaint(Color.black); g2.drawString(""+(int)lectura+ ""+""+(int)(incertidumbre)+" A",posicion_x_cadena,10); } } }

Observar que en esta clase se implementaron las interfaces


MouseListener

MouseMotionListener,

que esta dan la posibilidad de desplegar eventos de desplazamiento del

ratn sobre la pantalla. Todos los mtodos de estas interfaces fueron implementados aunque algunos sin cdigo. La implementacin de estos eventos se realiz sin el uso del IDE. EspectroSolar.java
package espectros; import java.awt.*; import java.awt.geom.*; import java.util.*; /** * * @author gloria */ public class EspectroSolar extends EspectroLuzBlanca { private Vector lineas_espectro_solar=new Vector(); /** Creates a new instance of EspectroSolar */ public EspectroSolar() {

17

lineasEspectroSolar(); on=false;

//lneas de Fraunhofer public void lineasEspectroSolar(){ lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new lineas_espectro_solar.addElement(new } Double(6870)); Double(6563)); Double(5896)); Double(5890)); Double(5270)); Double(5172)); Double(5183)); Double(4861)); Double(4308));

//dibujar espectro luz solar public void paintComponent(Graphics g) { super.paintComponent(g); //leer datos de las lneas de Fraunhofer for (int i=0;i<lineas_espectro_solar.size();i++){ Double longitud_onda_D=(Double)lineas_espectro_solar.elementAt(i); longitud_onda= longitud_onda_D.doubleValue(); calcular_posicion_linea(); g2.setPaint(Color.black); g2.fill (new Rectangle2D.Double(largo-posicion,0,1,ancho)); } on=true; //despliegue de la lectura if(desplegar_cadena==true&&on==true){ g2.setPaint(new Color(255,255,0,160)); g2.fillRect(posicion_x_cadena,0,60,12); g2.setPaint(Color.black); g2.drawString(""+(int)lectura+ ""+""+(int)(incertidumbre)+" A", posicion_x_cadena,10); on=false; } } }

EspectroElemento.java
package espectros; import java.awt.*; import java.awt.geom.*; import java.util.*; public class EspectroElemento extends EspectroLuzBlanca { private Vector lineas_espectro_elemento=new Vector(); //espectro emision private boolean emision=true; /** Creates a new instance of EspectroElemento */ public EspectroElemento() { on=false; } public void datosEspectro(Vector lineas_espectro_elemento){ this.lineas_espectro_elemento=lineas_espectro_elemento; repaint(); } public void espectroEmision(boolean emision){ this.emision=emision; repaint(); }

18

//dibujar espectro del elemento public void paintComponent(Graphics g) { super.paintComponent(g); //Dibujar el espectro de absorcin if (emision==false){ //leer datos for (int i=0;i<lineas_espectro_elemento.size();i++){ Double longitud_onda_D=(Double)lineas_espectro_elemento.elementAt(i); longitud_onda= longitud_onda_D.doubleValue(); calcular_posicion_linea(); g2.setPaint(Color.black); g2.fill (new Rectangle2D.Double(largo-posicion,0,1,ancho)); } } //Dibujar el espectro de emisin Vector posicion_linea=new Vector(); if (emision==true){ /*Implementacin del vector posicon_linea que contendr las posiciones sobre la pantalla en las cuales se dibujarn las lneas espectrales. */ for (int i=0;i<lineas_espectro_elemento.size();i++){ Double longitud_onda_D=(Double)lineas_espectro_elemento.elementAt(i); longitud_onda= longitud_onda_D.doubleValue(); calcular_posicion_linea(); posicion_linea.addElement(posicion); } /* Implementacin del arreglo ceros[] compuesto de cero y unos. * Los ceros indicarn en donde se debe dibujar una lnea negra sobre * el espectro de la luz blanca. Al final slo quedar lneas de colores * que indican las lineas espectrales de emisin del elemento. */ int[] ceros=new int[(int)largo]; g2.setPaint(Color.black); Double p=null; double valor=0; for(int j=0;j<largo;j++){ for (int k=0;k<posicion_linea.size();k++){ p=(Double)posicion_linea.elementAt(k); valor= p.doubleValue(); if(j==(int)(largo-valor)){ ceros[j]=1; break; } else { ceros[j]=0; } }}//for j for (int m=0;m<largo;m++){ if (ceros[m]==0){ g2.drawLine(m,0,m,ancho); } }//for } //despliegue de la lectura on=true; if(desplegar_cadena==true&&on==true){ g2.setPaint(new Color(255,255,0,160)); g2.fillRect(posicion_x_cadena,0,60,12); g2.setPaint(Color.black); g2.drawString(""+(int)lectura+ ""+""+(int)(incertidumbre)+" A",posicion_x_cadena,10); on=false; } } }

19

Implementacin de las clases responsable de desplegar los espectros Paso 14: Ubicar el cursor en el paquete visualizadores del rbol Projects. Hacer Clic derecho y escoger New > JFrame Form y en la ventana desplegada escribir como nombre de la clase FrameEspectros. El IDE adquiere la siguiente forma,

Paso 15: En el rbol Inspector ubicar el cursor sobre JFrame, hacer clic derecho y en el popmen desplegado escoger Set Layout > GridLayout con las siguientes propiedades,

Adicionar a JFrame cuatro JPanel y un JList de tal forma que el panel Inspector adquiera la siguiente forma,

20

Realizar los alios necesarios para que el panel Design adquiera la siguiente apariencia,

Paso 16: Completar el cdigo de la clase FrameEspectros.java. Agregar el cdigo en rojo a la clase FrameEspectros.java,
package visualizadores; import datos.DatosEspectros; import espectros.*; import java.awt.*; import javax.swing.*;

21

import java.awt.event.*; import java.util.*; public class FrameEspectros extends javax.swing.JFrame { EspectroLuzBlanca espectro_1=new EspectroLuzBlanca(); EspectroSolar espectro_2=new EspectroSolar(); EspectroElemento espectro_3=new EspectroElemento(); EspectroElemento espectro_4=new EspectroElemento(); /** Creates new form FrameEspectros */ public FrameEspectros() { initComponents(); this.setLocationRelativeTo(this.getParent()); //ttulo del frame this.setTitle( "Visualizacin de los espectros"); //tamao this.setSize(600,400); //El frame de la aplicacin no puede cambiar de tamao this.setResizable(false); //pegar los espectros jPanel_luz_blanca.setLayout(new GridLayout(1,1,5,5)); jPanel_luz_blanca.add(espectro_1); jPanel_solar.setLayout(new GridLayout(1,1,5,5)); //espectro_2.visualizarEspectroSolar(true); jPanel_solar.add(espectro_2); jPanel_absorcion.setLayout(new GridLayout(1,1,5,5)); espectro_3.espectroEmision(false); jPanel_absorcion.add(espectro_3); jPanel_emision.setLayout(new GridLayout(1,1,5,5)); espectro_4.espectroEmision(true); jPanel_emision.add(espectro_4); cargarItems(); //evento que nos permite cerrar la ventana WindowListener l =new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }; //fin evento cerrar ventana /*avisa al programa quin es el responsable de cerrar la ventana*/ this.addWindowListener(l); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); //localizacin en el centr de la pantalla this.setLocation( (screenSize.width-this.getWidth())/2, (screenSize.height-this.getHeight())/2 ); //El frame de la aplicacin es visible this.setVisible(true); } private void cargarItems(){ String nombre_actual=""; Vector datos=new Vector(); for (int i=0;i<DatosEspectros.nombre_elemento.size();i++){ //agregar itemes de los elementos a la lista //Condicin para no repetir item String nombre= (String)DatosEspectros.nombre_elemento.elementAt(i); //Condicin para no repetir item

22

if (nombre_actual.equals(nombre)==false){ datos.addElement(nombre); nombre_actual=nombre; } } } jList_elementos.setListData(datos);

Implementar el evento que despliega las lneas de los espectros Paso 17: Hacer doble clic en TablaEspectros del paquete Visualizadores del panel Projects. Ubicar el cursor sobre jMenuItem_visualizar_espectros del rbol Inspector y hacer clic derecho. En el popmen desplegado escoger Events > Action > ationPerformed y en donde se sumerja en cursor completar el cdigo en rojo,
private void jMenuItem_visualizar_espectrosActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: FrameEspectros frame=new FrameEspectros(); }

Compilar y ejecutar. Escoger del men Archivo, Leer archivo y luego del men Visualizar, Visualizar espectros. Se deber desplegar la siguiente pantalla,

23

Agregar los eventos de la lista de los elementos para poder acceder a sus espectros. Paso 18: Hacer doble clic en FrameEspectros del paquete visualizadores del rbol del panel Projects. Ubicar el cursor sobre jList_elementos del rbol de Inspector y seleccionar Events > LsitSelection >valueChanged y donde quede sumergido el cursor agregar el siguiente cdigo en rojo,
private void jList_elementosValueChanged(javax.swing.event.ListSelectionEvent evt) { // TODO add your handling code here: String elemento_seleccionado=(String)jList_elementos.getSelectedValue(); Vector longitudes_onda=new Vector(); for (int i=1;i<DatosEspectros.nombre_elemento.size();i++){ String elemento=(String)DatosEspectros.nombre_elemento.elementAt(i); if(elemento.equals(elemento_seleccionado)==true){ longitudes_onda.addElement(DatosEspectros.longitudes_onda.elementAt(i)); }//fin if }//fin for //exportar datos espectro_4.datosEspectro(longitudes_onda); //espectro_4.espectroEmision(true); espectro_3.datosEspectro(longitudes_onda); //espectro_3.espectroAbsorcion(true); }

Compilar y ejecutar. Escoger del men Archivo, Leer archivo y luego del men Visualizar, Visualizar espectros. Podr seleccionar cualquier elemento y se desplegaran sus espectros de emisin y absorcin en el visible. En la siguiente figura se ilustra el caso del hidrogeno,

24

Pulir la aplicacin Antes de abrir el archivo de datos debera estar inactivado el item de Visiaulizar espectros. En la clase TablaEspecttos.java agregar el siguiente cdigo en rojo,
public TablaEspectros() { initComponents(); jMenuItem_visualizar_espectros.setEnabled(false); }

Distribuir la aplicacin En la carpeta donde esta guardado el proyecto, en el subdirectorio dist, se encuentra el archivo ejecutable, EjemploEspectros.jar. Este archivo se debe entregar con el archivo plano de datos, datos_espectros.txt. El usuario los ubicara en una misma carpeta. Para ejecutar la aplicacin se debe hacer doble clic en el archivo EjemploEspectros.jar. Obviamente el computador deber tener instalado el jre 1.6 (la mquina virtual de java). Felicitaciones, dio otro GRAN PASO en el desarrollo de software empleando el NetBeans 5.5.

25

II. Visualizacin de charts empleando el paquete JFreeChart


Empezar la aplicacin Paso 1: Ejecutar el IDE NetBeans 5.5. Seleccionar en la barra de men, File > New Project En la ventana que se despliega, seleccionar General > Java Application y se desplegar la siguiente ventana,

Escribir en el nombre del proyecto, EjemploCharts y en la localizacin del proyecto elegir la carpeta donde se almacenar. Tngase en cuenta que la aplicacin ser en contexto grfico y la clase principal ser un Jrame que contendr el mtodo main, por lo que se debern desactivar las opciones Set as Main Project y Create Main Class. Presionar el botn Finish. El panel Projects tendr la siguiente forma,

26

Paso 2: Ubicar el cursor en <deafault package>, hacer clic derecho y seleccionar new > JFrame Form y se desplegar la siguiente ventana,

Escribir en Class Name, Charts y oprimir Fins. El panel Projects tendr ahora la siguiente forma,

27

El panel Inspector tendr el siguiente aspecto,

Paso 3: Proceda a realizar los pasos necesarios hasta que el panel Projeccts tenga el siguiente aspecto (tngase en cuenta que las clases de los paquetes charts y datos se construyen con la opcin New > Java Class),

28

y que el panel Inspector tenga el siguiente aspecto (debe tenerse en cuenta que una vez adicionado un JTabdedPane, se deber agregar a este los JPanel necesarios; en este caso sern siete).

29

Paso 4: Importar el paquete JFreeChart. Ubicar el cursor en Libraries del rbol del panel Projects. Hacer clic derecho y escoger Add JAR?Foldery seleccione el paquete org (este paquete lo ha debido bajar de la pgina del curso). El aspecto del panel Projects es ahora el siguiente,

30

Paso 5: Agregar el cdigo necesario de las clases de los paquetes charts y datos. Complete el cdigo de las clases de los paquetes charts y datos: GraficoAreas.java
package charts; import javax.swing.*;

31

import java.awt.*; import org.jfree.chart.*; import org.jfree.chart.axis.*; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.title.TextTitle; import org.jfree.data.CategoryDataset; import org.jfree.data.DatasetUtilities; import org.jfree.ui.*; import java.awt.image.*; public class GraficoAreas extends JComponent { //variables private int ancho=300; // private int alto; BufferedImage grafica = null; //datos private CategoryDataset datos; //titulos private String series="Series "; private String tipo="Tipo "; private String titulo="Titulo"; private String subtitulo="Subitulo"; private String eje_x="Categora"; private String eje_y="Valor";

/** Creates a new instance of GraficoPie2D */ public GraficoAreas(String series,String tipo) { //tamao preferido this.setPreferredSize(new Dimension(400,400)); this.series=series; this.tipo=tipo; } public void setTitulos(String titulo,String subtitulo, String eje_x,String eje_y){ this.titulo=titulo; this.subtitulo=subtitulo; this.eje_x=eje_x; this.eje_y=eje_y; }

public void setValoresAreas(double [][] ad){ datos= DatasetUtilities.createCategoryDataset(series, tipo, ad); } private BufferedImage crearImagen(int ancho)

32

{ JFreeChart chart = ChartFactory.createAreaChart(titulo, eje_x, eje_y, datos, PlotOrientation.VERTICAL, true, true, false); StandardLegend standardlegend = (StandardLegend)chart.getLegend(); standardlegend.setAnchor(3); chart.setBackgroundPaint(Color.white); TextTitle texttitle = new TextTitle(subtitulo); texttitle.setFont(new Font("SansSerif", 0, 12)); texttitle.setPosition(RectangleEdge.TOP); texttitle.setSpacer(new Spacer(0, 0.05D, 0.05D, 0.05D, 0.05D)); texttitle.setVerticalAlignment(VerticalAlignment.BOTTOM); chart.addSubtitle(texttitle); CategoryPlot categoryplot = chart.getCategoryPlot(); categoryplot.setForegroundAlpha(0.5F); categoryplot.setAxisOffset(new Spacer(1, 5D, 5D, 5D, 5D)); categoryplot.setBackgroundPaint(Color.lightGray); categoryplot.setDomainGridlinesVisible(true); categoryplot.setDomainGridlinePaint(Color.white); categoryplot.setRangeGridlinesVisible(true); categoryplot.setRangeGridlinePaint(Color.white); CategoryAxis categoryaxis = categoryplot.getDomainAxis(); categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); categoryaxis.setLowerMargin(0.0D); categoryaxis.setUpperMargin(0.0D); NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis(); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); numberaxis.setLabelAngle(0.0D);

BufferedImage image = chart.createBufferedImage(ancho,ancho); return image; } public void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

33

GraficoBar3D.java
package charts; import javax.swing.*; import java.awt.*; import org.jfree.chart.*; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.CategoryDataset; import org.jfree.data.DatasetUtilities; import java.awt.image.*;

public class GraficoBar3D extends JComponent { //variables private int ancho=300; // private int alto; BufferedImage grafica = null; //datos private CategoryDataset datos; //titulos private String series="Series "; private String tipo="Tipo "; private String titulo="Barras en 3D"; private String eje_x="Categora"; private String eje_y="Valor"; /** Creates a new instance of GraficoPie2D */ public GraficoBar3D(String series,String tipo) { //tamao preferido this.setPreferredSize(new Dimension(400,400)); this.series=series; this.tipo=tipo; } public void setTitulos(String titulo,String eje_x,String eje_y){ this.titulo=titulo; this.eje_x=eje_x; this.eje_y=eje_y; } public void setValoresBar3D(double [][] ad){ datos= DatasetUtilities.createCategoryDataset("Series ", "Categora ", ad); }

34

private BufferedImage crearImagen(int ancho) { JFreeChart chart = ChartFactory.createBarChart3D(titulo, eje_x, eje_y, datos, PlotOrientation.VERTICAL, true, true, false); //alios CategoryPlot categoryplot = chart.getCategoryPlot(); CategoryAxis categoryaxis = categoryplot.getDomainAxis(); categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPo sitions(0.39269908169872414D)); BufferedImage image = chart.createBufferedImage(ancho,ancho); return image; }

public

void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

GraficoMultiplesEjes.java
package charts; import javax.swing.*; import java.awt.*; import java.awt.image.*; import org.jfree.chart.*; import org.jfree.data.*; import org.jfree.chart.axis.AxisLocation; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.StandardXYItemRenderer; import org.jfree.chart.renderer.XYItemRenderer; import org.jfree.chart.title.TextTitle; import org.jfree.data.XYDataset;

35

import org.jfree.ui.RefineryUtilities;

public class GraficoMultiplesEjes extends JComponent { //variables private int ancho=300; // private int alto; BufferedImage grafica = null; //datos XYSeries series_1 = new XYSeries("Evolucion 1"); XYSeries series_2 = new XYSeries("Evolucion 2"); XYSeries series_3 = new XYSeries("Evolucion 3"); XYSeries series_4 = new XYSeries("Evolucion 4"); /** Creates a new instance of GraficoPie2D */ public GraficoMultiplesEjes() { //tamao preferido this.setPreferredSize(new Dimension(400,400)); }

public void setValoresXY(int n,double x, double y){ if(n==1){ series_1.add(x,y);} if(n==2){ series_2.add(x,y);} if(n==3){ series_3.add(x,y);} if(n==4){ series_4.add(x,y);} } public BufferedImage crearImagen(int ancho) { XYDataset datos= new XYSeriesCollection(series_1); //Eje 1 createTimeSeriesChart JFreeChart chart = ChartFactory.createXYLineChart("Mltiples Ejes","Tiempo en Das","Rango Eje 1",datos,PlotOrientation.VERTICAL,false,false,true); chart.addSubtitle(new TextTitle("Cuatro conjunto de datos y cuatro rangos de ejes.")); XYPlot xyplot = chart.getXYPlot(); xyplot.setOrientation(PlotOrientation.VERTICAL); xyplot.setBackgroundPaint(Color.lightGray); xyplot.setDomainGridlinePaint(Color.white); xyplot.setRangeGridlinePaint(Color.white); xyplot.setAxisOffset(new Spacer(1, 5D, 5D, 5D, 5D)); StandardXYItemRenderer (StandardXYItemRenderer)xyplot.getRenderer(); standardxyitemrenderer.setPaint(Color.black); //Eje 2 standardxyitemrenderer =

36

NumberAxis numberaxis = new NumberAxis("Rango Eje 2"); numberaxis.setAutoRangeIncludesZero(false); numberaxis.setLabelPaint(Color.red); numberaxis.setTickLabelPaint(Color.red); xyplot.setSecondaryRangeAxis(0, numberaxis); xyplot.setSecondaryRangeAxisLocation(0, AxisLocation.BOTTOM_OR_LEFT); XYDataset datos_2= new XYSeriesCollection(series_2); xyplot.setSecondaryDataset(0, datos_2); xyplot.mapSecondaryDatasetToRangeAxis(0, new Integer(0)); xyplot.setSecondaryRenderer(0, new StandardXYItemRenderer()); xyplot.getSecondaryRenderer(0).setSeriesPaint(0, Color.red); //Eje 3 NumberAxis numberaxis1 = new NumberAxis("Rango Eje 3"); numberaxis1.setLabelPaint(Color.blue); numberaxis1.setTickLabelPaint(Color.blue); xyplot.setSecondaryRangeAxis(1, numberaxis1); XYDataset datos_3= new XYSeriesCollection(series_3); xyplot.setSecondaryDataset(1, datos_3); xyplot.mapSecondaryDatasetToRangeAxis(1, new Integer(1)); xyplot.setSecondaryRenderer(1, new StandardXYItemRenderer()); xyplot.getSecondaryRenderer(1).setSeriesPaint(0, Color.blue); //Eje 4 NumberAxis numberaxis2 = new NumberAxis("Rango Eje 4"); numberaxis2.setLabelPaint(Color.green); numberaxis2.setTickLabelPaint(Color.green); xyplot.setSecondaryRangeAxis(2, numberaxis2); XYDataset datos_4= new XYSeriesCollection(series_4); xyplot.setSecondaryDataset(2, datos_4); xyplot.mapSecondaryDatasetToRangeAxis(2, new Integer(2)); xyplot.setSecondaryRenderer(2, new StandardXYItemRenderer()); xyplot.getSecondaryRenderer(2).setSeriesPaint(0, Color.green);

BufferedImage image = chart.createBufferedImage(ancho,ancho); return image; } public void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

37

GraficoPie2D.java
package charts; import javax.swing.*; import java.awt.*; import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; import java.awt.image.*;

public class GraficoPie2D extends JComponent { //variables private int ancho=300; String titulo; // private int alto; BufferedImage grafica = null; //datos DefaultPieDataset pieDataset= new DefaultPieDataset(); /** Creates a new instance of GraficoPie2D */ public GraficoPie2D(String titulo) { //tamao preferido this.setPreferredSize(new Dimension(400,400)); this.titulo=titulo; }

public void setValoresPie2D(String nombre,int numero){ pieDataset.setValue(nombre, new Integer(numero)); }

public BufferedImage crearImagen(int ancho) { JFreeChart chart = ChartFactory.createPieChart(titulo, pieDataset, true, true, true); BufferedImage image = chart.createBufferedImage(ancho,ancho); return image; }

38

public

void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

GraficoPie3D.java
package charts; import javax.swing.*; import java.awt.*; import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; import org.jfree.util.Rotation; import java.awt.image.*;

public class GraficoPie3D extends JComponent { //variables private int ancho=300; String titulo; //datos DefaultPieDataset piedataset= new DefaultPieDataset(); // private int alto; BufferedImage grafica = null; /** Creates a new instance of GraficoPie2D */ public GraficoPie3D(String titulo) { //tamao preferido this.setPreferredSize(new Dimension(400,400)); this.titulo=titulo; }

public void setValoresPie3D(String nombre,double numero){ piedataset.setValue(nombre, new Double(numero)); }

39

public BufferedImage crearImagen(int ancho) { JFreeChart chart = ChartFactory.createPieChart3D(titulo, piedataset, true, true, false); //alios Pie3DPlot pie3dplot = (Pie3DPlot)chart.getPlot(); pie3dplot.setStartAngle(270D); pie3dplot.setDirection(Rotation.CLOCKWISE); pie3dplot.setForegroundAlpha(0.5F); pie3dplot.setNoDataMessage("No data to display"); BufferedImage image = chart.createBufferedImage(ancho,ancho); return image; } public void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

GraficoXY.java
package charts; import javax.swing.*; import java.awt.*; import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; import java.awt.image.*;

public class GraficoXY extends JComponent { //variables private int ancho=300; private String titulo,nombre_eje_x,nombre_eje_y; // private int alto; BufferedImage grafica = null; XYSeries series = new XYSeries("Evolucion");

40

/** Creates a new instance of Pie3D */ public GraficoXY(String titulo,String nombre_eje_x,String nombre_eje_y) { //tamao preferido this.setPreferredSize(new Dimension(400,400)); this.titulo=titulo; this.nombre_eje_x=nombre_eje_x; this.nombre_eje_y=nombre_eje_y; }

public void setValoresXY(double x, double y){ series.add(x,y); } private BufferedImage crearImagen(int ancho) { XYDataset datos= new XYSeriesCollection(series); JFreeChart AL,false,false,true); BufferedImage image = chart.createBufferedImage(ancho,ancho); return image; } chart = ChartFactory.createXYLineChart(titulo,nombre_eje_x,nombre_eje_y,datos,PlotOrientation.VERTIC

public

void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

GraficoXYAnimado.java
package charts; import javax.swing.*; import java.awt.*; import org.jfree.data.*; import org.jfree.chart.*;

41

import org.jfree.chart.plot.*; import java.awt.image.*; import datos.*;

public class GraficoXYAnimado extends JComponent //variables private int ancho=300; // private int alto; BufferedImage grafica = null; XYSeries series; //hilo de animacion private Thread hilo; //paso private double dt=0.05; private double tiempo;

implements Runnable{

/** Creates a new instance of Pie3D */ public GraficoXYAnimado() { //tamao preferido this.setPreferredSize(new Dimension(400,400)); cargarValores(); arrancar(); }

public void cargarValores(){ series= new XYSeries("Evolucion"); for (int i=0;i<DatosCharts.brillo_solar.size()-1;i++){ double valor=((Double)DatosCharts.brillo_solar.elementAt(i)).doubleValue(); series.add(i+0.5*Math.random()*i,valor+0.2*Math.random()*valor );//simulacin de datos variables } } public BufferedImage crearImagen(int ancho) {

XYDataset datos= new XYSeriesCollection(series); JFreeChart chart = ChartFactory.createXYLineChart ("Brillo Solar: Ciudad X 1970-1985", "Bimestre","Brillo (horas)",datos,PlotOrientation.VERTICAL,false,false,true); BufferedImage image = chart.createBufferedImage(ancho,ancho);

42

return image; }

public void run(){ while(hilo!=null){ try{ series=null;//anular datos cargarValores(); repaint(); Thread.sleep(100); }//fin try catch(InterruptedException e){}//fin catch }//fin while }//fin run //arrancar la animacin public void arrancar(){ hilo=new Thread(this); hilo.start(); } //parar la animacin public void detener(){ //mata el hilo hilo = null; }

public

void paintComponent(Graphics g) {

//Contexto grfico en java 2 ancho=this.getWidth(); Graphics2D g2 = (Graphics2D) g; //Mejora la calidad del dibujo con el antialising de java 2 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); grafica = this.crearImagen(ancho); g2.drawImage(grafica,0,0,null); } }

DatosCharts.java
package datos; import java.util.*;

43

public class DatosCharts { //Datos de GraficoXY public static Vector brillo_solar=new Vector(); //Datos GraficoPie2D public static Vector sistema_operativo=new Vector(); public static Vector sistema_operativo_cantidad=new Vector(); //Datos GraficoPie3D public static Vector lenguajes=new Vector(); public static Vector lenguajes_cantidad=new Vector(); //Datos GraficoBar3D public static Vector datos_bar_3d_serie_1=new Vector(); public static Vector datos_bar_3d_serie_2=new Vector(); public static Vector datos_bar_3d_serie_3=new Vector(); public static Vector datos_bar_3d_serie_4=new Vector(); public static Vector datos_bar_3d_serie_5=new Vector(); public static Vector datos_bar_3d_serie_6=new Vector(); public static Vector datos_bar_3d_serie_7=new Vector(); public static Vector datos_bar_3d_serie_8=new Vector(); public static Vector datos_bar_3d_serie_9=new Vector(); //Datos GraficoAreas public static Vector datos_areas_serie_1=new Vector(); public static Vector datos_areas_serie_2=new Vector(); public static Vector datos_areas_serie_3=new Vector(); //Datos GraficoMultiplesEjes public static Vector datos_ejes_1=new Vector(); public static Vector datos_ejes_2=new Vector(); public static Vector datos_ejes_3=new Vector(); public static Vector datos_ejes_4=new Vector();

public DatosCharts(){ } }

Paso 6: Agregar el siguiente cdigo en rojo a la clase principal Charts.java. ANALICE BIEN los mtodos encargados de cargar los datos. Ellos leen los archivos .txt suministrados bajarlos de la pgina del curso-: BrilloSolar.txt, Lenguajes.txt, Sistemas.txt, EjesMultiples.txt. DatosMultiplesBar3D.txt, DatosMultilesAreas.txt, suministrados; estos archivos se deben ubicar en la carpeta

del proyecto. Adms esos mtodos cargan los datos en la clase DatosCharts.java y los exportan a las clases graficadoras con la estructura correcta.
import charts.*;

44

import java.awt.*; import java.io.*; import datos.*;

public class Charts extends javax.swing.JFrame { //Crear grfica xy GraficoXY grafico_xy; GraficoPie2D grafico_pie2d; GraficoPie3D grafico_pie3d; GraficoBar3D grafico_bar3d; GraficoMultiplesEjes grafico_multiples_ejes; GraficoAreas grafico_areas; GraficoXYAnimado grafico_xy_animado; /** Creates new form Charts */ public Charts() { initComponents(); //crear grficos grafico_xy=new GraficoXY("Brillo Solar, ciudad X 1970,1985", "Bimestres", "Brillo (Horas)"); grafico_pie2d=new grafico_pie3d=new grafico_bar3d=new GraficoPie2D("Sistemas Operativos"); GraficoPie3D("Lenguajes"); GraficoBar3D("Series ","Tipo ");

customizarGraficoBar3D(); grafico_multiples_ejes=new grafico_areas=new GraficoMultiplesEjes();

GraficoAreas("Series ","Tipo ");

customizarGraficoAreas(); grafico_xy_animado=new GraficoXYAnimado();

this.setTitle("Charts con JFreeChart"); this.setSize(450,540); this.setResizable(false); jPanel_xy.setLayout(new GridLayout(1,1)); //jPanel_xy.add(grafico_xy); jPanel_pie2d.setLayout(new GridLayout(1,1)); jPanel_pie2d.add(grafico_pie2d); jPanel_pie3d.setLayout(new GridLayout(1,1)); jPanel_pie3d.add(grafico_pie3d); jPanel_bar3d.setLayout(new GridLayout(1,1)); jPanel_bar3d.add(grafico_bar3d); jPanel_multiplesxy.setLayout(new GridLayout(1,1));

45

jPanel_multiplesxy.add(grafico_multiples_ejes); jPanel_area.setLayout(new GridLayout(1,1)); jPanel_area.add(grafico_areas); jPanel_animado.setLayout(new GridLayout(1,1)); jPanel_animado.add(grafico_xy_animado); }

private void customizarGraficoAreas(){ grafico_areas.setTitulos("Chart Areas","Demostracin","Categora", "Valor"); } private void customizarGraficoBar3D(){ grafico_bar3d.setTitulos("Chart Barras 3D","Categora", "Valor"); } private void leerDatos(){ jTabbedPane_graficos.setEnabled(true); jPanel_xy.add(grafico_xy); cargarDatosXY(); cargarDatosPie2D(); cargarDatosPie3D(); cargarDatosBar3D(); cargarDatosAreas(); cargarDatosMultiplesEjes(); jMenuItem_leer_archivos.setEnabled(false); repaint(); } private void cargarDatosXY(){ //Leer los datos del archivo BrilloSolar.txt y almacenarlos en la clase Datos.java try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("BrilloSolar.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en DatosCharts StreamTokenizer streamtokenizer = new StreamTokenizer(text); //Guardar los datos en la clase Datos.java String cadena=""; while(cadena.equals("End")==false){

46

//Guardar los datos en la clase Datos.java streamtokenizer.nextToken(); cadena = streamtokenizer.sval; streamtokenizer.nextToken(); double brillo_solar = streamtokenizer.nval; DatosCharts.brillo_solar.addElement( new Double(brillo_solar)); } //5. Cerrar el canal text.close(); } catch(IOException ioexception){} // Exportar los datos al objeto de la clase GraficoXY for (int i=0;i<DatosCharts.brillo_solar.size()-1;i++){ double valor=((Double)DatosCharts.brillo_solar.elementAt(i)).doubleValue(); grafico_xy.setValoresXY(i,valor); } } private void cargarDatosPie2D(){ //Leer los datos del archivo Sistemas.txt y almacenarlos en la clase DatosCharts try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("Sistemas.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en Datos StreamTokenizer streamtokenizer = new StreamTokenizer(text); //Guardar los datos en la clase Datos.java String cadena=""; while(cadena.equals("End")==false){ streamtokenizer.nextToken(); cadena = streamtokenizer.sval; DatosCharts.sistema_operativo.addElement(cadena); streamtokenizer.nextToken(); double cantidad = streamtokenizer.nval;

47

DatosCharts.sistema_operativo_cantidad.addElement( new Double(cantidad));

} //5. Cerrar el canal text.close(); } catch(IOException ioexception){} // Exportar los datos al objeto de la clase GraficoPie2D for (int i=0;i<DatosCharts.sistema_operativo_cantidad.size()-1;i++){ String nombre= (String)DatosCharts.sistema_operativo.elementAt(i); double valor=((Double)DatosCharts.sistema_operativo_cantidad.elementAt(i)).doubleValue(); grafico_pie2d.setValoresPie2D(nombre,(int)valor); } } private void cargarDatosPie3D(){ //Leer los datos del archivo Lenguajes.txt y almacenarlos en la clase DatosCharts try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("Lenguajes.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en Datos StreamTokenizer streamtokenizer = new StreamTokenizer(text); String cadena=""; while(cadena.equals("End")==false){ streamtokenizer.nextToken(); cadena = streamtokenizer.sval; //Guardar los datos en la clase Datos.java DatosCharts.lenguajes.addElement(cadena); streamtokenizer.nextToken(); double cantidad = streamtokenizer.nval; //Guardar los datos en la clase Datos.java DatosCharts.lenguajes_cantidad.addElement( new Double(cantidad));

48

} //5. Cerrar el canal text.close(); } catch(IOException ioexception){} // Exportar los datos al objeto de la clase GraficoPie3D for (int i=0;i<DatosCharts.sistema_operativo_cantidad.size()-1;i++){ String nombre= (String)DatosCharts.lenguajes.elementAt(i); double valor=((Double)DatosCharts.lenguajes_cantidad.elementAt(i)).doubleValue(); grafico_pie3d.setValoresPie3D(nombre,valor); } } private void cargarDatosBar3D(){ //Leer los datos del archivo DatosMultiplesBar3D y almacenarlos en la clase DatosCharts try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("DatosMultiplesBar3D.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en Datos StreamTokenizer streamtokenizer = new StreamTokenizer(text); String cadena=""; while(cadena.equals("End")==false){ //Guardar los datos en la clase Datos.java streamtokenizer.nextToken(); cadena = streamtokenizer.sval; //guardarlos en arreglos dentro de un vector den DatosCharts for(int i=1;i<5;i++){ streamtokenizer.nextToken(); double cantidad = streamtokenizer.nval; //Guardar los datos en la clase Datos.java if(cadena.equals("serie1")){ DatosCharts.datos_bar_3d_serie_1.addElement( new Double(cantidad)); } if(cadena.equals("serie2")){ DatosCharts.datos_bar_3d_serie_2.addElement( new Double(cantidad)); }

49

if(cadena.equals("serie3")){ DatosCharts.datos_bar_3d_serie_3.addElement( new Double(cantidad)); } if(cadena.equals("serie4")){ DatosCharts.datos_bar_3d_serie_4.addElement( new Double(cantidad)); } if(cadena.equals("serie5")){ DatosCharts.datos_bar_3d_serie_5.addElement( new Double(cantidad)); } if(cadena.equals("serie6")){ DatosCharts.datos_bar_3d_serie_6.addElement( new Double(cantidad)); } if(cadena.equals("serie7")){ DatosCharts.datos_bar_3d_serie_7.addElement( new Double(cantidad)); } if(cadena.equals("serie8")){ DatosCharts.datos_bar_3d_serie_8.addElement( new Double(cantidad)); } if(cadena.equals("serie9")){ DatosCharts.datos_bar_3d_serie_9.addElement( new Double(cantidad)); } } } //5. Cerrar el canal text.close(); } catch(IOException ioexception){} // Exportar los datos al objeto de la clase GraficoAreas con la estructura [][] double[][] arreglo_datos=new double[9][4]; for (int i=0;i<9;i++){ for(int j=0;j<4;j++){ double valor=0.0; if(i==0){ valor=((Double)DatosCharts.datos_bar_3d_serie_1.elementAt(j)).doubleValue(); } if(i==1){

50

valor=((Double)DatosCharts.datos_bar_3d_serie_2.elementAt(j)).doubleValue(); } if(i==2){ valor=((Double)DatosCharts.datos_bar_3d_serie_3.elementAt(j)).doubleValue(); } if(i==3){ valor=((Double)DatosCharts.datos_bar_3d_serie_4.elementAt(j)).doubleValue(); } if(i==4){ valor=((Double)DatosCharts.datos_bar_3d_serie_5.elementAt(j)).doubleValue(); } if(i==5){ valor=((Double)DatosCharts.datos_bar_3d_serie_6.elementAt(j)).doubleValue(); } if(i==6){ valor=((Double)DatosCharts.datos_bar_3d_serie_7.elementAt(j)).doubleValue(); } if(i==7){ valor=((Double)DatosCharts.datos_bar_3d_serie_8.elementAt(j)).doubleValue(); } if(i==8){ valor=((Double)DatosCharts.datos_bar_3d_serie_9.elementAt(j)).doubleValue(); } arreglo_datos[i][j]=valor; } } grafico_bar3d.setValoresBar3D(arreglo_datos); }

private void cargarDatosAreas(){ //Leer los datos del archivo DatosMultiplesAreas.txt y almacenarlos en la clase DatosCharts try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("DatosMultiplesAreas.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en Datos StreamTokenizer streamtokenizer = new StreamTokenizer(text);

51

String cadena=""; while(cadena.equals("End")==false){ //Guardar los datos en la clase Datos.java streamtokenizer.nextToken(); cadena = streamtokenizer.sval; //guardarlos en arreglos dentro de un vector den DatosCharts for(int i=1;i<9;i++){ streamtokenizer.nextToken(); double cantidad = streamtokenizer.nval; //Guardar los datos en la clase Datos.java if(cadena.equals("serie1")){ DatosCharts.datos_areas_serie_1.addElement( new Double(cantidad)); } if(cadena.equals("serie2")){ DatosCharts.datos_areas_serie_2.addElement( new Double(cantidad)); } if(cadena.equals("serie3")){ DatosCharts.datos_areas_serie_3.addElement( new Double(cantidad)); } } } //5. Cerrar el canal text.close(); } catch(IOException ioexception){} // Exportar los datos al objeto de la clase GraficoAreas con la estructura [][] double[][] arreglo_datos=new double[3][8]; for (int i=0;i<3;i++){ for(int j=0;j<8;j++){ double valor=0.0; if(i==0){ valor=((Double)DatosCharts.datos_areas_serie_1.elementAt(j)).doubleValue(); } if(i==1){ valor=((Double)DatosCharts.datos_areas_serie_2.elementAt(j)).doubleValue(); } if(i==2){ valor=((Double)DatosCharts.datos_areas_serie_3.elementAt(j)).doubleValue(); } arreglo_datos[i][j]=valor;

52

} } grafico_areas.setValoresAreas(arreglo_datos); }

private void cargarDatosMultiplesEjes(){ //Leer los datos del archivo EjesMultiples.txt y almacenarlos en la clase DatosCharts try { //Leer los datos //1. Crear objeto de archivo File archivo_fuente=new File("EjesMultiples.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en Datos StreamTokenizer streamtokenizer = new StreamTokenizer(text); String cadena="";

while(cadena.equals("End")==false){ //Guardar los datos en la clase Datos.java streamtokenizer.nextToken(); cadena = streamtokenizer.sval; //guardarlos en arreglos dentro de un vector den DatosCharts streamtokenizer.nextToken(); double cantidad_1 = streamtokenizer.nval; //Guardar los datos en la clase Datos.java DatosCharts.datos_ejes_1.addElement( new Double(cantidad_1)); streamtokenizer.nextToken(); double cantidad_2 = streamtokenizer.nval; //Guardar los datos en la clase Datos.java DatosCharts.datos_ejes_2.addElement( new Double(cantidad_2));

streamtokenizer.nextToken(); double cantidad_3 = streamtokenizer.nval; // Guardar los datos en la clase Datos.java DatosCharts.datos_ejes_3.addElement( new Double(cantidad_3));

streamtokenizer.nextToken();

53

double cantidad_4 = streamtokenizer.nval; //Guardar los datos en la clase Datos.java DatosCharts.datos_ejes_4.addElement( new Double(cantidad_4));

} //5. Cerrar el canal text.close(); } catch(IOException ioexception){} // Exportar los datos al objeto de la clase GraficoMultiplesEjes for (int i=0;i<DatosCharts.datos_ejes_1.size()-1;i++){ double valor_1=((Double)DatosCharts.datos_ejes_1.elementAt(i)).doubleValue(); grafico_multiples_ejes.setValoresXY(1,i,valor_1); double valor_2=((Double)DatosCharts.datos_ejes_2.elementAt(i)).doubleValue(); grafico_multiples_ejes.setValoresXY(2,i,valor_2); double valor_3=((Double)DatosCharts.datos_ejes_3.elementAt(i)).doubleValue(); grafico_multiples_ejes.setValoresXY(3,i,valor_3); double valor_4=((Double)DatosCharts.datos_ejes_4.elementAt(i)).doubleValue(); grafico_multiples_ejes.setValoresXY(4,i,valor_4); } }

Paso 7: Agregar loe eventos a los jmenuitems. Agregar a jMenuItem_leer_archivos y a jMenuItem_salir eventos actionPerformed y agregar el siguiente cdigo en rojo,
private void jMenuItem_salirActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: System.exit(0); } private void jMenuItem_leer_archivosActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: leerDatos(); }

Paso 8: Pulir Desactivar de propiedades a jTabbedPane. Esto es con el objeto de que cuando inicie la ejecucin de aplicacin slo se active cuando se hayan cargado los datos.

54

Paso 9: Compile y ejecute la aplicacin. Deber obtenerse la siguiente GUI,

Seleccionar Leer los archivos y se obtendr,

55

Escogiendo los diferentes paneles obtendr diferentes vistas,

56

Distribuir la aplicacin En la carpeta donde esta guardado el proyecto, en el subdirectorio dist, se encuentra el archivo ejecutable, EjemploCharts.jar y la carpeta lib (en ella esta hospedado el paquete de JFreeChart). Ambos se deben entregar; adems se debern incluir los archivos planos de datos: BrilloSolar.txt, Lenguajes.txt, Sistemas.txt, El EjesMultiples.txt.

DatosMultiplesBar3D.txt,

DatosMultilesAreas.txt,

usuario ubicar todos estos recursos en una misma carpeta. Para ejecutar la aplicacin se debe hacer doble clic en el archivo EjemploCharts.jar. Obviamente el computador deber tener instalado el jre 1.6 (la mquina virtual de java). Felicitaciones. Ya estas listo(a) para enfrentar la realizacin de tus propias

aplicaciones empleando el IDE NetBeans 5.5.

III. Visualizacin Cientfica usando el paquete ViSAD


1. Dar los pasos necesarios para que los paneles Projects e Inspector queden con el siguiente aspecto,

57

58

2. Agregar el cdigo necesario de las clases de los paquetes visualizacion y datos. Complete el cdigo de las clases de los paquetes visualizacion y datos: DatosVisad.java
package datos; import java.util.*; import datos.*;

public class DatosVisad { //Datos de Grafico_tipo_1 public static Vector x=new Vector(); public static Vector y=new Vector(); public static Vector z=new Vector(); /** Creates a new instance of DatosVisad */ public DatosVisad() { } }

59

VisualizadorVisad1D
package visualizacion; import visad.*; import visad.java2d.DisplayImplJ2D; import java.rmi.RemoteException; import java.awt.*; import javax.swing.*;

public class VisualizadorVisad1D extends JComponent{ // Declare variables // The quantities to be displayed in x- and y-axes private RealType time,height,velocidad,aceleracion; // The functions ( time -> height ) private FunctionType func_t_h, func_t_v,func_t_a; // Our Data values for x are represented by the set private Linear1DSet time_set;//Set // A new unit, to measure velocidad private Unit mps; // A new unit, to measure aceleracin private Unit mpss; //The Data class FlatField, which will hold time and height data // and the same for speed private FlatField height_ff,velocidad_ff,aceleracion_ff; // The DataReference from the data to display private DataReferenceImpl t_h_ref,t_v_ref,t_a_ref; // The 2D display, and its the maps private DisplayImpl display; private ScalarMap timeMap, heightYMap, hcMap,velocidadYMap,vcMap,aceleracionYMap,acMap; private Component comp; int LENGTH; float[][] h_vals; float[][] v_vals; float[][] a_vals; float[][] t_vals; private String eje_x; private String eje_y; private String eje_yy; private String eje_yyy;

/** Creates a new instance of VisualizadorVisad1D */ public VisualizadorVisad1D(String eje_x,String eje_y,String eje_yy,String eje_yyy ) { this.eje_x=eje_x; this.eje_y=eje_y; this.eje_yy=eje_yy;

60

this.eje_yyy=eje_yyy; //tamao preferido this.setPreferredSize(new Dimension(400,400)); }

public void customizarVariables(int LENGTH,double x_min,double x_max,double y_min, double y_max,double v_min, double v_max,double a_min,double a_max){ this.LENGTH=LENGTH; // Create a new unit for speed, meters per seconds try { // Create a FunctionType, that is the class which represents the function y = f(x) // Use FunctionType(MathType domain, MathType range) // Create the quantities // Use RealType(String name, Unit u, Set set), set is null time = RealType.getRealType(eje_x, SI.second, null);//"time" height = RealType.getRealType(eje_y, SI.meter, null); // Create a new unit for speed, meters per seconds mps = SI.meter.divide( SI.second ); velocidad = RealType.getRealType(eje_yy, mps, null);//"velocidad" // Create a new unit for speed, meters per seconds cuadrados mpss = (SI.meter.divide( SI.second )).divide( SI.second ); aceleracion = RealType.getRealType(eje_yyy, mpss, null);

func_t_h = new FunctionType( time, height ); time_set = new Linear1DSet(time,x_min, x_max, LENGTH); func_t_v = new FunctionType( time, velocidad ); func_t_a = new FunctionType( time, aceleracion); //xxx // and put the y values above in it display = new DisplayImplJ2D("display1"); // Get display's graphics mode control and draw scales GraphicsModeControl dispGMC = (GraphicsModeControl) display.getGraphicsModeControl(); dispGMC.setScaleEnable(true); dispGMC.setLineWidth( 1.0f ); timeMap = new ScalarMap( time, Display.XAxis ); heightYMap = new ScalarMap( height, Display.YAxis ); heightYMap.setRange(y_min,y_max);

velocidadYMap = new ScalarMap( velocidad, Display.YAxis ); velocidadYMap.setRange(v_min,v_max);//

61

aceleracionYMap = new ScalarMap( aceleracion, Display.YAxis ); aceleracionYMap.setRange(a_min,a_max);

h_vals = new float[1][LENGTH];//sobra t_vals = new float[1][LENGTH];//sobra v_vals = new float[1][LENGTH];//sobra a_vals = new float[1][LENGTH];//sobra } catch(RemoteException ioexception){} catch(VisADException rexception){} } public void visualizar() throws RemoteException, VisADException{

// Add maps to display display.addMap( timeMap ); display.addMap( heightYMap ); display.addMap( velocidadYMap ); display.addMap( aceleracionYMap ); // Choose yellow as the color for the speed curve // Choose yellow as the color for the speed curve float velocidadRed = 1.0f; float velocidadGreen = 1.0f; float velocidadBlue = 0.0f; float[] velocidadColor = new float[]{velocidadRed, velocidadGreen, velocidadBlue}; // ...and color the axis with the same yellow velocidadYMap.setScaleColor( velocidadColor ); // Choose verde as the color for the speed curve // Choose yellow as the color for the speed curve float aceleracionRed = 0.0f; float aceleracionGreen = 1.0f; float aceleracionBlue = 0.0f; float[] aceleracionColor = new float[]{aceleracionRed, aceleracionGreen, aceleracionBlue}; // ...and color the axis with the same green aceleracionYMap.setScaleColor( aceleracionColor );

// ...and color the axis with the same yellow // heightYMap.setRange( 0, 10.0); // uncomment the following line if you don't want speed axis to be drawn

62

// Create a data reference and set the FlatField as our data t_h_ref = new DataReferenceImpl("t_h_ref"); t_v_ref = new DataReferenceImpl("t_v_ref"); t_a_ref = new DataReferenceImpl("t_a_ref"); // Create Display and its maps t_h_ref.setData( height_ff ); t_v_ref.setData( velocidad_ff ); t_a_ref.setData( aceleracion_ff );

// Add reference to display display.addReference( t_h_ref );

// Create Constantmaps for speed and add its reference to display ConstantMap[] velocidadCMap = {new ConstantMap( velocidadRed, Display.Red), new ConstantMap( velocidadGreen, Display.Green), new ConstantMap( velocidadBlue, Display.Blue), new ConstantMap( 1.50f, Display.LineWidth)}; display.addReference( t_v_ref, velocidadCMap );

// Create Constantmaps for speed and add its reference to display ConstantMap[] aceleracionCMap = {new ConstantMap( aceleracionRed, Display.Red), new ConstantMap( aceleracionGreen, Display.Green), new ConstantMap( aceleracionBlue, Display.Blue), new ConstantMap( 1.50f, Display.LineWidth)}; display.addReference( t_a_ref,aceleracionCMap ); // Create Constantmaps for speed and add its reference to display this.setLayout(new GridLayout(1,1)); comp= display.getComponent(); this.add(comp); }

public void setDatosVisad1D(double valores_posicion[],double valores_velocidad[],double valores_aceleracion[]){ h_vals = new float[1][LENGTH]; v_vals = new float[1][LENGTH]; a_vals = new float[1][LENGTH];

63

for (int i=0;i<LENGTH;i++){ h_vals[0][i]=(float)valores_posicion[i]; v_vals[0][i]=(float)valores_velocidad[i]; a_vals[0][i]=(float)valores_aceleracion[i]; } try { height_ff = new FlatField( func_t_h, time_set); height_ff.setSamples( h_vals,false); velocidad_ff = new FlatField( func_t_v, time_set); velocidad_ff.setSamples( v_vals,false); aceleracion_ff = new FlatField( func_t_a, time_set); aceleracion_ff.setSamples( a_vals,false); } catch(RemoteException ioexception){} catch(VisADException rexception){} } }

VisualizadorVisad2D.java
package visualizacion; import visad.*; import visad.util.*; import visad.java2d.DisplayImplJ2D; import java.rmi.RemoteException; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class VisualizadorVisad2D extends JComponent{ private RealType longitude, latitude; private RealType temperature; // Tuple to pack longitude and latitude together, as the domain private RealTupleType domain_tuple;

// The function (domain_tuple -> temperature ) // Remeber, range is only "temperature"

64

private FunctionType func_domain_temp; // Our Data values for the domain are represented by the Set private Set domain_set; // The Data class FlatField private FlatField vals_ff; // The DataReference from data to display private DataReferenceImpl data_ref; // The 2D display, and its the maps private DisplayImpl display; private ScalarMap latMap, lonMap; private ScalarMap tempIsoMap, tempRGBMap; // These objects are for drawing isocontours private RealType isoTemperature; private FunctionType func_domain_isoTemp; private FlatField iso_vals_ff; private DataReferenceImpl iso_data_ref; private Component comp; public VisualizadorVisad2D(){ //tamao preferido this.setPreferredSize(new Dimension(400,400)); } public void visualizar () throws RemoteException, VisADException { // Create the quantities // Use RealType(String name); latitude = RealType.getRealType("latitude"); longitude = RealType.getRealType("longitude"); domain_tuple = new RealTupleType(latitude, longitude); temperature = RealType.getRealType("temperature", SI.kelvin, null); isoTemperature = RealType.getRealType("isoTemperature", SI.kelvin, null); // Create a FunctionType (domain_tuple -> temperature ) // Use FunctionType(MathType domain, MathType range) func_domain_temp = new FunctionType( domain_tuple, temperature); // ... the same for isoTemperature func_domain_isoTemp = new FunctionType( domain_tuple, isoTemperature); // Create the domain Set

65

// Use LinearDSet(MathType type, double first1, double last1, int lengthX, // int NCOLS = 50; int NROWS = NCOLS; domain_set = new Linear2DSet(domain_tuple, -Math.PI, Math.PI, NROWS, -Math.PI, Math.PI, NCOLS); double first2, double last2, int lengthY)

// Get the Set samples to facilitate the calculations float[][] set_samples = domain_set.getSamples( true );

// The actual temperature values are stored in this array // float[1][ number_of_samples ] float[][] flat_samples = new float[1][NCOLS * NROWS]; // We fill our 'flat' array with the generated values // by looping over NCOLS and NROWS for(int c = 0; c < NCOLS; c++) for(int r = 0; r < NROWS; r++){ // ...temperature flat_samples[0][ c * NROWS + r ] = (float)( (Math.sin( 0.50*(double) set_samples[0][ c * NROWS + r ]) ) * Math.cos( (double) set_samples[1][ c * NROWS + r ] ) ) ;

// Create the FlatFields // Use FlatField(FunctionType type, Set domain_set) // For the colored image vals_ff = new FlatField( func_domain_temp, domain_set); // ...and put the values above into it // Note the argument false, meaning that the array won't be copied vals_ff.setSamples( flat_samples , false );

66

// ...and for the isocontours iso_vals_ff = new FlatField( func_domain_isoTemp, domain_set);

// Get the values from the temperature FlatField // create flat_isoVals array for clarity's sake // "false" argument means "don't copy" float[][] flat_isoVals = vals_ff.getFloats(false);

// ...and put the values above into it // Note the argument false, meaning that the array won't be copied again iso_vals_ff.setSamples( flat_isoVals , false );

// Create Display and its maps // A 2D display display = new DisplayImplJ2D("display1"); // Get display's graphics mode control and draw scales GraphicsModeControl dispGMC = (GraphicsModeControl) dispGMC.setScaleEnable(true); display.getGraphicsModeControl();

// Create the ScalarMaps: latitude to YAxis, longitude to XAxis and // temperature to RGB and // isoTemperature to IsoContour // Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar) latMap = new ScalarMap( latitude, Display.YAxis );

lonMap = new ScalarMap( longitude, Display.XAxis ); tempIsoMap = new ScalarMap( isoTemperature, tempRGBMap = new ScalarMap( temperature, Display.IsoContour );

Display.RGB );

// Add maps to display

67

display.addMap( latMap ); display.addMap( lonMap ); display.addMap( tempIsoMap ); display.addMap( tempRGBMap ); // The ContourControl // Note that we get the control from the IsoContour map ContourControl isoControl = (ContourControl) tempIsoMap.getControl(); // Define some parameters for contour lines float interval = 0.1250f; float lowValue = -0.50f; float highValue = 1.0f; float base = -1.0f; // interval between lines // lowest value // highest value // starting at this base value

// ...and set the lines with the method isoControl.setContourInterval(interval, lowValue, highValue, base); isoControl.enableLabels(true); // Create data references and set the FlatField as our data data_ref = new DataReferenceImpl("data_ref"); iso_data_ref = new DataReferenceImpl("iso_data_ref"); data_ref.setData( vals_ff ); iso_data_ref.setData( iso_vals_ff ); // Add reference to display display.addReference( data_ref ); display.addReference( iso_data_ref );

this.setLayout(new GridLayout(1,1)); comp= display.getComponent(); this.add(comp); } }

VisualizadorVisad3D.java

68

package visualizacion; import visad.*; import visad.util.*; import visad.java3d.DisplayImplJ3D; import visad.java3d.DisplayPanelJ3D; import java.rmi.RemoteException; import java.awt.*; import javax.swing.*; import java.awt.event.*;

public class VisualizadorVisad3D extends JComponent{ // Declare variables private int NCOLS; private int NROWS; private double[][] alt_samples; // The domain quantities longitude and latitude // and the dependent quantity altitude private RealType longitude, latitude; private RealType altitude; // Tuple to pack longitude and latitude together private RealTupleType domain_tuple; // The function (domain_tuple -> altitude ) private FunctionType func_domain_alt; // Our Data values for the domain are represented by the Set private Set domain_set; // The Data class FlatField private FlatField vals_ff; // The DataReference from data to display private DataReferenceImpl data_ref; // The 2D display, and its the maps private DisplayImpl display; private ScalarMap latMap, lonMap; private ScalarMap altMap, altRGBMap; private ColorControl colCont; private String eje_x;//="Eje_x"; private String eje_y;//="Eje_y"; private String eje_z;///="Eje_z"; private FlatField slope_vals_ff; private double[][] flat_samples; private Component comp; private FunctionType func_domain_slope; private RealType slope; private ScalarMap slopeRGBMap; private double x_min=0;

69

private double x_max=20; private double y_min=0; private double y_max=20; private double z_min=-1000; private double z_max=1000; public VisualizadorVisad3D(String eje_x,String eje_y, String eje_z){ this.eje_x=eje_x; this.eje_y=eje_y; this.eje_z=eje_z; //tamao preferido this.setPreferredSize(new Dimension(400,400)); }

public void customizarVariables(int NROWS, int NCOLS,double x_min,double x_max,double y_min, double y_max, double z_min, double z_max){ this.NROWS=NROWS; this.NCOLS=NCOLS; this.x_min=x_min; this.x_max=x_max; this.y_min=y_min; this.y_max=y_max; this.z_min=z_min; this.z_max=z_max; try { latitude = RealType.getRealType(eje_x, SI.meter, null); longitude = RealType.getRealType(eje_y, SI.meter, null); domain_tuple = new RealTupleType(latitude, longitude); altitude = RealType.getRealType(eje_z, SI.meter, null); func_domain_alt = new FunctionType( domain_tuple, altitude); domain_set = new Linear2DSet(domain_tuple,x_min,x_max, NROWS,y_min,y_max, NCOLS); // Create a FlatField // Use FlatField(FunctionType type, Set domain_set) // Create Display and its maps display = new DisplayImplJ3D("display1"); // Get display's graphics mode control and draw scales GraphicsModeControl dispGMC = (GraphicsModeControl) dispGMC.setScaleEnable(true); // Also enable Texture dispGMC.setTextureEnable(false); // Create the ScalarMaps: latitude to XAxis, longitude to YAxis and // altitude to ZAxis and to RGB display.getGraphicsModeControl();

70

// Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar) latMap = new ScalarMap( latitude, altRGBMap = new ScalarMap( altitude, altMap = new ScalarMap( altitude, // Add maps to display display.addMap( latMap ); display.addMap( lonMap ); display.addMap( altMap ); display.addMap( altRGBMap ); } catch(RemoteException ioexception){} catch(VisADException rexception){} } public void visualizar() throws RemoteException, VisADException{ Display.YAxis ); Display.RGB ); lonMap = new ScalarMap( longitude, Display.XAxis ); Display.ZAxis );

//Create the quantities display.addMap( slopeRGBMap ); // Create a data reference and set the FlatField as our data data_ref = new DataReferenceImpl("data_ref"); data_ref.setData( vals_ff ); // Data reference for slope DataReferenceImpl data_ref2 = new DataReferenceImpl("data_ref2"); data_ref2.setData( slope_vals_ff ); // Add reference to display ConstantMap[] constAlpha_CMap = {new ConstantMap( 0.50f, Display.Alpha)}; ConstantMap[] constZ_CMap = {new ConstantMap( -1.0f, Display.ZAxis)}; latMap.setRange(y_min,y_max); altMap.setRange(z_min,z_max); // Add references to display display.addReference( data_ref2, constZ_CMap ); display.addReference( data_ref, constAlpha_CMap ); this.setLayout(new GridLayout(1,1)); comp= display.getComponent(); this.add(comp); } public void setDatosVisad3D(double[][] alt_samples){ this.alt_samples=alt_samples; flat_samples = new double[1][NCOLS * NROWS]; int index = 0; for(int c = 0; c < NCOLS; c++) for(int r = 0; r < NROWS; r++){

71

// set altitude altitude flat_samples[0][ index ] = alt_samples[r][c]; // increment index index++; } try { vals_ff = new FlatField( func_domain_alt, domain_set); // ...and put the altitude values above into it // Note the argument false, meaning that the array won't be copied vals_ff.setSamples( flat_samples , false ); // Code for slope data // Data in a FlatField //FlatField slope_vals_ff ; // Calculate derivative of altitude with respect to longitude; assume no errors slope_vals_ff = (FlatField) vals_ff.derivative( longitude, Data.NO_ERRORS ); // Get the funtionc from the FlatField for slope func_domain_slope = ((FunctionType)slope_vals_ff.getType()); // "slope" is a RealType; slope = (RealType) func_domain_slope.getRange(); // Create a ScalarMap to color slope's surface slopeRGBMap = new ScalarMap(slope, Display.RGB ); } catch(RemoteException ioexception){} catch(VisADException rexception){} } }

VisualizadorVisad3Danimacion.java

package visualizacion; import visad.*; import visad.util.*; import visad.java2d.DisplayImplJ2D; import visad.java3d.DisplayImplJ3D; import java.rmi.RemoteException; import java.awt.*; import javax.swing.*; import java.util.Calendar; import java.util.GregorianCalendar; public class VisualizadorVisad3DAnimacion extends JComponent{ // Declare variables private int NCOLS;//=200; private int NROWS;//=200;

72

private double[][] alt_samples; // The RealTypes private RealType time, longitude, latitude; private RealType altitude, temperature; private float[][] set_samples; private double[][] flat_samples; GraphicsModeControl dispGMC; private int tSamples=12; private double startValue =10.0; // The function // (( longitude, latitude ) // The function // ( time -> ( ( longitude, latitude ) -> ( altitude, temperature ) ) ) private FunctionType func_t_latlon; // Our Data values for longitude, latitude are represented by the set private Set latlonSet; // Time values are given by the set by the set private Set timeSet; // The FlatField private FlatField latlon_at_ff; // A FieldImpl private FieldImpl timeField; // The DataReference from the data to display private DataReferenceImpl data_ref; // The 2D display, and its the maps private DisplayImpl display; private ScalarMap timeAnimMap, timeZMap; private ScalarMap lonXMap, latYMap, altiZMap, temperRGBMap; private AnimationWidget animWid; private Component comp; AnimationControl ac; RealTupleType altitemp; RealTupleType latlon; -> ( altitude, temperature ) ) private FunctionType func_latlon_at;

public VisualizadorVisad3DAnimacion(String eje_x,String eje_y,String eje_z){ //tamao preferido this.setPreferredSize(new Dimension(400,400)); }//fin del constructor public void visualizar() throws RemoteException, VisADException {

// Create a data reference and set the FieldImpl as our data data_ref = new DataReferenceImpl("amp_len_ref");

73

data_ref.setData( timeField ); // Add reference to display ConstantMap[] constAlpha_CMap = {new ConstantMap( 0.5f, Display.Alpha)}; display.addReference( data_ref, constAlpha_CMap ); // Get AnimationControl from the Animation ScalarMap ac = (AnimationControl) timeAnimMap.getControl(); // Create application window, put display into it comp= display.getComponent(); this.setLayout(new GridLayout(1,1)); this.add(comp); }

public void customizarVariables(int tSamples,int NROWS, int NCOLS,double x_min,double x_max,double y_min, double y_max, double z_min, double z_max){ this.tSamples=tSamples; this.NROWS=NROWS; this.NCOLS=NCOLS; try { altitude = RealType.getRealType("eje_z", SI.meter, null); temperature = RealType.getRealType("temperature", SI.kelvin, null); // The RealTypes above form a tuple altitemp = new RealTupleType(altitude, temperature); longitude = RealType.getRealType("eje_x", SI.meter, null); latitude = RealType.getRealType("eje_y", SI.meter, null); latlon = new RealTupleType(longitude, latitude); time = RealType.getRealTypeByName("Time"); func_latlon_at = new FunctionType(latlon,altitemp); func_t_latlon = new FunctionType(time, func_latlon_at ); // domain_set = new Linear2DSet(domain_tuple,0,20, NROWS,0, 20, NCOLS); latlonSet = new Linear2DSet(latlon, x_min, x_max, NROWS,y_min, y_max, NCOLS);//0,20 timeSet = new Linear1DSet(time, startValue, startValue + tSamples, tSamples); //set_samples = latlonSet.getSamples( false );//arreglar color de otra forma latlon_at_ff = new FlatField( func_latlon_at, latlonSet); timeField = new FieldImpl( func_t_latlon, timeSet); display = new DisplayImplJ3D("display1");

// Get display's graphics mode control draw scales dispGMC = (GraphicsModeControl) display.getGraphicsModeControl(); dispGMC.setScaleEnable(true); // Create the ScalarMaps lonXMap = new ScalarMap( longitude, Display.XAxis ); latYMap = new ScalarMap( latitude, Display.YAxis ); altiZMap = new ScalarMap( altitude, Display.ZAxis );

74

temperRGBMap

= new ScalarMap( altitude, Display.RGB );

// display.addMap( slopeRGBMap ); timeAnimMap = new ScalarMap( time, Display.Animation ); // Add maps to display display.addMap( lonXMap ); display.addMap( latYMap ); display.addMap( altiZMap ); display.addMap( temperRGBMap ); display.addMap( timeAnimMap ); altiZMap.setRange(z_min,z_max); //importante cuadrar escala en z }catch(RemoteException ioexception){} catch(VisADException rexception){} -40000,40000

} public void animar(boolean empezar){ try { ac.setOn( empezar ); ac.setStep(100); } catch(RemoteException ioexception){} catch(VisADException rexception){} } public void setIntervaloAnimacion(int intervalo){ try { ac.setStep(intervalo); } catch(RemoteException ioexception){} catch(VisADException rexception){} } public void setDatosVisad3D_Muestras_Animacion(int t,double[][] alt_samples ){ this.alt_samples=alt_samples; flat_samples = new double[2][NCOLS * NROWS]; int index = 0; for(int c = 0; c < NCOLS; c++) for(int r = 0; r < NROWS; r++){ // set altitude altitude flat_samples[0][ index ] = alt_samples[r][c];

75

// increment index index++; }

try { // set those values in the FlatField latlon_at_ff.setSamples(flat_samples); // and the FlatField as the t-th Field value timeField.setSample( t, latlon_at_ff } catch(RemoteException ioexception){} catch(VisADException rexception){} );

} }

3. Agregar el siguiente cdigo en rojo a la clase principal Visad.java. ANALICE BIEN los mtodos encargados de cargar los datos con la estructura correcta y tambin los exportan a las clases que los necesitan. Uno de esos mtodos lee un archivo denominado datos_xyz.txt, el cual se debe ubicar en la carpeta del proyecto (el archivo lo debe bajra de la pgina del curso). Visad.java
import java.io.*; import datos.*; import visualizacion.*; import visad.*; import java.rmi.RemoteException; import java.awt.*; public class Visad extends javax.swing.JFrame { VisualizadorVisad1D visualizador_1d; VisualizadorVisad2D visualizador_2d; VisualizadorVisad3D visualizador_3d; VisualizadorVisad3DAnimacion visualizador_3d_animacion;

double[][] alt_samples = new double[200][200]; /** Creates new form Visad */

76

public Visad() { initComponents(); this.setSize(650,650); this.setTitle("Visualizacin Cientfica con VISAD"); this.setResizable(false); //Crear los visualizadores visualizador_1d=new VisualizadorVisad1D("tiempo","posicion","velocidad","aceleracion"); _3d=new VisualizadorVisad3D("Eje_x","Eje_y","ELONGACION"); visualizador_3d_animacion=new VisualizadorVisad3DAnimacion("Eje_x","Eje_y","ELONGACION"); //pegar los visualizadores a los paneles respectivos jPanel_visad_1d.add(visualizador_1d); jPanel_visad_2d.add(visualizador_2d); jPanel_visad_3d.add(visualizador_3d); jPanel_visad_3d_animado.add(visualizador_3d_animacion); }

public void cargarDatosVisualizador1D(){ int LENGTH=40; double x_min=0; double x_max=20; double y_min=-40; double y_max=-5; double v_min=-20; double v_max=20; double a_min=-40; double a_max=40;

visualizador_1d.customizarVariables(LENGTH, x_min, x_max,y_min, y_max,v_min,v_max,a_min,a_max); double valores_posicion[]=new double[LENGTH]; double valores_velocidad[]=new double[LENGTH]; double valores_aceleracion[]=new double[LENGTH]; int k=-1; for (double x=0;x<4;x=x+0.1){ double y=2*Math.pow(x,3)-10*Math.pow(x,2)+x-5; double dy=6*Math.pow(x,2)-20*Math.pow(x,1)+1; double ddy=12*Math.pow(x,1)-20; k=k+1; valores_posicion[k]=y; valores_velocidad[k]=dy; valores_aceleracion[k]=ddy;

77

} try { visualizador_1d.setDatosVisad1D(valores_posicion,valores_velocidad,valores_aceleracion); visualizador_1d.visualizar(); } catch(RemoteException ioexception){} catch(VisADException rexception){} }

public void cargarDatosVisualizador2D(){ try { // } visualizador_2d.setDatosVisad2D(valores); visualizador_2d.visualizar(); catch(RemoteException ioexception){} catch(VisADException rexception){} }

public void cargarDatosVisualizador3D(){ int NCOLS=200; int NROWS=200; double x_min=0; double x_max=20; double y_min=0; double y_max=20; double z_min=-10000; double z_max=10000; visualizador_3d.customizarVariables(NROWS, NCOLS,x_min,x_max,y_min,y_max,z_min,z_max); //Leer los datos try { //1. Crear objeto de archivo File archivo_fuente=new File("datos_xyz.txt"); //2. Crear flujo de entrada FileReader flujo_entrada=new FileReader(archivo_fuente); //3. Acoplarle un filtro para aumentar la eficiencia BufferedReader text = new BufferedReader(flujo_entrada); //4. Procesar informacin: en este caso guardarla en DatosCharts

78

StreamTokenizer streamtokenizer = new StreamTokenizer(text); //Guardar los datos en la clase Datos.java String cadena=""; while(cadena.equals("End")==false){ //Guardar los datos en la clase Datos.java streamtokenizer.nextToken(); cadena = streamtokenizer.sval; streamtokenizer.nextToken(); double x = streamtokenizer.nval; DatosVisad.x.addElement( new Double(x)); //System.out.println(""+x); streamtokenizer.nextToken(); double y = streamtokenizer.nval; DatosVisad.y.addElement( new Double(y)); streamtokenizer.nextToken(); double z = streamtokenizer.nval; DatosVisad.z.addElement( new Double(z)); } //5. Cerrar el canal text.close(); } catch(IOException ioexception){} //cargar los datos en el objeto de tipo VisualizadorVisad3D int k=-1; for (int i=0;i<NROWS;i=i+1){ for(int j=0;j<NCOLS;j=j+1){ k=k+1; alt_samples[i][j]=((Double)DatosVisad.z.elementAt(k)).doubleValue(); }//fin for j } //fin for i

try { visualizador_3d.setDatosVisad3D(alt_samples); visualizador_3d.visualizar(); } catch(RemoteException ioexception){} catch(VisADException rexception){}

79

public void cargarDatosVisualizador3DAnimado(){ int tSamples=8; int NCOLS=200; int NROWS=200; double x_min=0; double x_max=20; double y_min=0; double y_max=20; double z_min=-40000; double z_max=40000; visualizador_3d_animacion.customizarVariables(tSamples,NROWS, NCOLS,x_min,x_max,y_min,y_max,z_min,z_max); double[][] alt_samples_1 = new double[NROWS][NROWS]; //creacin de muestras for(int t=0;t<tSamples;t++){ // ...and then loop over columns and rows to calculate individual... double[] arreglo_z = new double[NCOLS * NROWS]; int m=-1; double a=1; for (double x=0; x<20; x=x+0.1) { for (double y=0; y<20;y=y+0.1){ m=m+1; //generar con la frmula y meterlos a un arreglo: Agregar dependencia con el tiempo arreglo_z[m]=20000*(Math.sin((0.05*(Math.PI/a)*x)))*(Math.sin((0.05*(Math.PI/a)*y)))*(Math.s in((Math.PI/a)*(1.0/4)*t)); }//fin for y }//fin for x //conformar alt_samples_1 int k=-1; for (int i=0;i<NROWS;i=i+1){ for(int j=0;j<NCOLS;j=j+1){ k=k+1; alt_samples_1[i][j]= arreglo_z[k]; } //fin for j }//fin for i

80

//exportar datos visualizador_3d_animacion.setDatosVisad3D_Muestras_Animacion(t,alt_samples_1 ); }//fin for t alt_samples_1=null; try { visualizador_3d_animacion.visualizar(); visualizador_3d_animacion.animar(true); visualizador_3d_animacion.setIntervaloAnimacion(100); } catch(RemoteException ioexception){} catch(VisADException rexception){} }//fin mtodo

4. Agregar los eventos a los jmenuitems. Agregar a jMenuItem_lectura_archivos y a jMenuItem_salir eventos actionPerformed y agregar el siguiente cdigo en rojo,
private void jMenuItem_lectura_archivosActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: //cargar y exprtar los datos a los visualizadores cargarDatosVisualizador2D(); cargarDatosVisualizador3D(); cargarDatosVisualizador3DAnimado(); cargarDatosVisualizador1D(); jTabbedPane_visualizadores.setEnabled(true); } private void jMenuItem_salirActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: System.exit(0); }

5. Pulir Desactivar de propiedades jTabbedPane_visualizadores. Esto es con el objeto de que cuando inicie la ejecucin de aplicacin slo se active cuando se hayan cargado los datos. 5. Compilar y ejecutar.

81

Deber obtenerse la siguiente GUI,

Seleccionar Leer los archivos y se obtendr,

82

Escogiendo los diferentes paneles obtendr diferentes vistas,

83

Distribuir la aplicacin En la carpeta donde esta guardado el proyecto, en el subdirectorio dist, se encuentra el archivo ejecutable, EjemploVisad.jar y la carpeta lib jar y la carpeta lib (en ella esta hospedado el paquete de Visad). Ambos se deben entregar; adems se deber incluir el archivo plano de datos: datos_xyz .txt. El usuario ubicar todos estos recursos en una misma carpeta. Para ejecutar la aplicacin se debe hacer doble clic en el archivo EjemploVisa.jar. Obviamente el computador deber tener instalado el jre 1.6 (la mquina virtual de java) y java 3D.

Tarea
1. Generar un archivo .txt que sirva como fuente de datos para graficar una superficie

z = f ( x, y ) .

Para

ello

utilice

la

aplicacin

84

GeneradorDatosXYZ_Txt.java la cual puede obtener de la pgina Web del curso. 2. Haga una apliaccin que lea el archivo txt generado en 1 y la grafique empleando las libreras de ViSAD. 3. La elongacin de un oscilador armnico en el sistema SI est dada por la siguiente ecuacin,

y = 0.500 sen t + 3
Empleando las libreras de ViSAD representar en un mismo grfico,

y vs t
y vs t

y vs t

4. Construya un documento .txt que representen los datos meteorolgicos de alguna ciudad de Colombia (http://bart.ideam.gov.co/cliciu/graficas.htm) y represntelos grficamente empleando el paquete JFreeChart. Valor de la tarea (10 % del 35 %). xitos.

85

Você também pode gostar