Aquí hay el inicio de una librería gráfica en java. Aunque ya es más o menos utilizable, está incompleta y pienso ir ampliándola. Está pensada de forma que se pueda ampliar fácilmente, así que puedes ir metiendo tus propios ObjetosGraficos o haciendo los retoques que creas necesarios. En esta página voy a comentar un poco la idea de cómo está pensada la librería y cómo utilizarla o ampliarla. Más abajo tienes links para bajarte la librería, sus fuentes y su documentación, así como para ver unos ejemplos:
Un problema normal en los gráficos es que nosotros queremos dibujar un gráfico con unas determinadas coordenadas (por ejemplo, una función matemática sin(x) va de 0.0 a 2*PI en el eje x y de -1 a 1 en el eje y), mientras que los ordenadores se empeñan en ofrecernos coordenadas de pixels. A las coordenadas de nuestro gráfico las llamaré coordenadas de usuario.
Para facilitar este trabaja, he creado una interface EscalaGrafica con todos (es un decir) los métodos de pintado de Graphics. Una clase hija EscalaGraficaCartesiana implementa estos metodos, pero haciendo la transformación de coordenadas. De esta forma, si en vez de dibujar directamente con Graphics, dibujamos con EscalaGraficaCartesiana, no debemos preocuparnos de transformar coordenadas de usuario en pixels.
EscalaGraficaCartesiana se inicializa pasándole cuales queremos que sean las coordenadas límite de nuestro gráfico. De esta forma, puede hacer las cuentas para transformar las coordenadas nuestras en pixels.
EscalaGrafica escala = new EscalaGraficaCartesiana();
escala.tomaExtremos (0.0, -1.0, 2*Math.PI, 1.0);
Ni en EscalaGrafica ni en EscalaGraficaCartesiana están implementados todos los métodos de Graphics. Es algo que tengo que añadir...
He hecho también una interface ObjetoGrafico. Esta interface tiene un único método dibujate(), que recibe una EscalaGrafica. Cualquier cosa que queramos dibujar debería ser una clase que implemente esta interface. En el método dibujate() debe dibujar lo que se quiera dibujar, pero siempre en coordenadas de usuario. No debemos preocuparnos de transformar a pixels.
Como ejemplos, he creado varios ObjetoGrafico que ya están disponibles para utilizar, aunque no son demasiado sofistificados:
He hecho una interface ObservadorRaton. Esta interface tiene el método eventoRaton(), al que se le pasa el evento de ratón y las coordenadas x,y de usuario en las que se ha producido el evento. El método debe devolver true si el tratamiento del evento hace que se necesite un repintado del gráfico y false en caso contrario.
Como ejemplos, he creado varios ObservadorRaton
Como componente de dibujo he creado un Lienzo, que hereda de JLayeredPane. Tiene dos capas de dibujo, para poder hacer un dibujo de fondo y otro por encima que normalmente es algún tipo de cursor que se mueve con el ratón. Este Lienzo se inicializa pasándole la EscalaGrafica que queramos (con sus límites de las coordendas de usuario). Admite que le añadamos todos los ObjetoGrafico que queramos. El Lienzo, cuando necesite repintado, llamará a todos los dibujate() de los ObjetoGrafico que tiene en su interior y presentará el dibujo en pantalla.
Lienzo lienzo = new Lienzo();
lienzo.tomaEscala (escala);
Histograma histograma = new Histograma (...);
lienzo.tomaObjetoGrafico(histograma);
He hecho un boton de zoom que permite acercar o alejar el gráfico. Se les inicializa pasándoles la misma EscalaGrafica que se pasa al Lienzo y el porcenaje de acercamiento o alejamiento que se desea cada vez que se pulse.
ZoomPorcentaje acercar = new ZoomPorcentaje (escala, 10);
ZoomPorcentaje alejar = new ZoomPorcentaje (escala, -10);
Es fácil implementar (y lo haré) unos botones de zoom inicial
y zoom previo.
Más abajo tienes tanto el jar como los fuentes. Si haces alguna
modificación interesante, añades alguna funcionalidad o corriges
algún error, por favor, envíamela
y la añadiré en esta página.
En chgraf.jar tienes el jar con las clases.
En fuentes.zip tienes los fuentes de las clases.
En javadoc.zip tienes la documentación de las clases.
También puedes verla en línea.
Los fuentes con los ejemplos los tienes en ejemplos.zip.