Programando en Java: Panel y Graphics (III)
Una vez terminado el parser para mi XML del que hablé en el anterior post de esta serie de artículos sobre Java, me he puesto ya con la parte interesante, los resultados, los gráficos.
A simple vista, puede parecer fácil dibujar unos ejes, y unas líneas de colores diferentes. Y lo es, pero para alguien que nunca había usado Java para esos menesteres, se hace algo complicado.
Además, a todo ello se une el hecho que la interfaz principal del programa no la he programado yo, sino que he usado Thinlet para hacerla, lo que simplifica mucho y ahorra conocer cómo funciona AWT, SWING, etc.
A continuación os explicaré cómo crear un Frame, y cómo pintar cosas en él.
Partía de la situación de una interfaz gráfica, con tabs (pestañas) creada con Thinlet, y quería crear un Panel (o una serie de Panels) para dibujar en cada uno un gráfico.
Buscando ejemplos por la red, lo que encontré fue que había que sobrecargar la función paint de la clase, pero de qué clase? Imagino que la cosa es fácil con un ejemplo de 3 líneas y una sola clase principal, pero cuando el proyecto es grande no sabes ni en que clase estás.
No sé habrá algún método mejor, pero lo que yo he hecho es lo siguiente:
Desde el constructor de mi clase principal (la que extiende de Thinlet), creo un objeto, declarado en la clase, que deriva de Frame:
visu = new Visualizar(this);
Y lo añado a mi Frame principal con add.
add(visu);
Aquí se pueden establecer parámetros como el tamaño, si es visible, etc.
visu.setBounds(50,100,500,350);
Lo interesante viene en la definición de la clase Visualizar, la declaro de la siguiente forma:
public class Visualizar extends Panel {
Al hacer que la clase Visualizar extiende de Panel, podremos sobrecargar el método paint y pintar automágicamente cosas en él.
Simplemente, definimos el método en la clase:
public void paint(Graphics gra) {
//Podemos recuperar la dimensión del panel con getBounds()
Rectangle r = this.getBounds();
//Y dibujar un par de líneas en él.
gra.drawLine(1,r.height-1,r.width, r.height-1);
gra.drawLine(1,1,1,r.height);
}
El resto es vuestro. Podéis usar todas las funciones que contiene Graphics para pintar cosas en el Panel. Cada vez que tenga que mostrarse el panel, se llama automáticamente la función paint().
Por cierto, en el caso que interese hacer desaparecer el panel en según que casos (por ejemplo, cuando cambio de tab me interesa que desaparezca el panel), simplemente hay que usar setVisible(), como en el ejemplo:
if(tab==2) {
visu.setVisible(false);
}
Referencias:
Programando en Java (II) - XML: http://www.gra2.com/article.php/20050228222237484
Programando en Java (I) - Thinlet: http://www.gra2.com/article.php/20050214225825123
Saludos,
Dani.
P.S: Gracias Valerie, por tu comentario en el anterior artículo. Gracias a gente como tú veo que a alguien le sirven los artículos y me dan ganas de seguir escribiéndolos.
A simple vista, puede parecer fácil dibujar unos ejes, y unas líneas de colores diferentes. Y lo es, pero para alguien que nunca había usado Java para esos menesteres, se hace algo complicado.
Además, a todo ello se une el hecho que la interfaz principal del programa no la he programado yo, sino que he usado Thinlet para hacerla, lo que simplifica mucho y ahorra conocer cómo funciona AWT, SWING, etc.
A continuación os explicaré cómo crear un Frame, y cómo pintar cosas en él.
Partía de la situación de una interfaz gráfica, con tabs (pestañas) creada con Thinlet, y quería crear un Panel (o una serie de Panels) para dibujar en cada uno un gráfico.
Buscando ejemplos por la red, lo que encontré fue que había que sobrecargar la función paint de la clase, pero de qué clase? Imagino que la cosa es fácil con un ejemplo de 3 líneas y una sola clase principal, pero cuando el proyecto es grande no sabes ni en que clase estás.
No sé habrá algún método mejor, pero lo que yo he hecho es lo siguiente:
Desde el constructor de mi clase principal (la que extiende de Thinlet), creo un objeto, declarado en la clase, que deriva de Frame:
visu = new Visualizar(this);
Y lo añado a mi Frame principal con add.
add(visu);
Aquí se pueden establecer parámetros como el tamaño, si es visible, etc.
visu.setBounds(50,100,500,350);
Lo interesante viene en la definición de la clase Visualizar, la declaro de la siguiente forma:
public class Visualizar extends Panel {
Al hacer que la clase Visualizar extiende de Panel, podremos sobrecargar el método paint y pintar automágicamente cosas en él.
Simplemente, definimos el método en la clase:
public void paint(Graphics gra) {
//Podemos recuperar la dimensión del panel con getBounds()
Rectangle r = this.getBounds();
//Y dibujar un par de líneas en él.
gra.drawLine(1,r.height-1,r.width, r.height-1);
gra.drawLine(1,1,1,r.height);
}
El resto es vuestro. Podéis usar todas las funciones que contiene Graphics para pintar cosas en el Panel. Cada vez que tenga que mostrarse el panel, se llama automáticamente la función paint().
Por cierto, en el caso que interese hacer desaparecer el panel en según que casos (por ejemplo, cuando cambio de tab me interesa que desaparezca el panel), simplemente hay que usar setVisible(), como en el ejemplo:
if(tab==2) {
visu.setVisible(false);
}
Referencias:
Programando en Java (II) - XML: http://www.gra2.com/article.php/20050228222237484
Programando en Java (I) - Thinlet: http://www.gra2.com/article.php/20050214225825123
Saludos,
Dani.
P.S: Gracias Valerie, por tu comentario en el anterior artículo. Gracias a gente como tú veo que a alguien le sirven los artículos y me dan ganas de seguir escribiéndolos.

