Hola amigos,
Ahora mismo me encuentro haciendo la parte gráfica del proyecto fin de carrera y lo que os voy a contar me está trayendo de cabeza.
Tengo que representar en un eje de coordenadas determinados datos en forma de puntos y determinadas líneas que los unen. Esa parte ya la he conseguido y aquí está el resultado:
Y ahora los 2 problemas que tengo son:
-
Cuando maximizo la ventana o cambio su tamaño desde los bordes, hace un parpadeo raro donde se ve como las vuelve a dibujar, pero acto seguido se borran quedando solo los ejes de coordenadas.
-
Cuando la ventana pierde el foco (véase que se saca por un lateral del monitor o bien cambias a otra ventana) como que se envían varias peticiones y al final se solapan entre ellas, oscureciendose así las lineas. Ejemplo:
Me he fijado e imagino que tiene que ver con el método repaint y la forma en que se hacen las llamadas.
PD: Aunque no sirva de mucho dejo aquí el código de la clase, por si os orienta en la resolución del problema.
Código/**
* Clae que impleenta la visualización en coordeandas cartesianas de un cojunto de datos.
* @author Pablo Culebras
*
*/
public class Cartesian2D extends JPanel {
private HashMap<Instance, Color> instaColor;
private CartesianRecord record;
/**
* Cosntructor.
*/
public Cartesian2D(){
this.setBackground(backgroundColor);
customClass=false;
paintNames=true;
paintAxis=true;
xIndex=0;
yIndex=0;
classIndex=0;
instaColor = new HashMap<Instance, Color>();
}
/**
* Establece el atributo a representar en el eje X.
* @param i indice del artibuto
*/
public void setXIndex(int i){
xIndex=i;
determineBounds(); //Como ha cambiado el eje X calculamos los límites.
repaint();
}
/**
* Establece el atributo a representar en el eje Y.
* @param i indice del atributo
*/
public void setYIndex(int i){
yIndex=i;
determineBounds(); //Como ha cambiado el eje Y calculamos los límites.
repaint();
}
/**
* Establece el indice de la clase.
* Si es negativo fuerza a no mostrar clase.
* @param i indice del atributo
*/
public void setCIndex(int i){
if(i<0){
classIndex=-1;
}else{
classIndex=i;
}
customClass=true;
repaint();
}
/**
* Calcula los máximos y mínimos de cada eje y de la clase.
*/
public void determineBounds(){
if(!customClass){//si no se ha especificado clase buscarla automáticamente
classIndex=data.classIndex();
if(classIndex==-1){
for(int i=0; i<data.numAttributes(); i++){
if("class".equals(data.attribute(i).name())){
classIndex=i;
break;
}
}
}
}
int n=data.numInstances();
for(int i=0; i<n; i++){
minX=Math.min(minX, data.get(i).value(xIndex));
minY=Math.min(minY, data.get(i).value(yIndex));
maxX=Math.max(maxX, data.get(i).value(xIndex));
maxY=Math.max(maxY, data.get(i).value(yIndex));
if(classIndex>=0){
minC=Math.min(minC, data.get(i).value(classIndex));
maxC=Math.max(maxC, data.get(i).value(classIndex));
}
}
}
/**
* Resetea los máximos y mínimos de cada eje.
*/
public void resetBounds(){
minX=Double.POSITIVE_INFINITY;
maxX=Double.NEGATIVE_INFINITY;
minY=Double.POSITIVE_INFINITY;
maxY=Double.NEGATIVE_INFINITY;
minC=Double.POSITIVE_INFINITY;
maxC=Double.NEGATIVE_INFINITY;
repaint();
}
/**
* Borra los datos actuales.
*/
public void clear(){
data=null;
resetBounds();
}
/**
* Dibuja el componente.
*/
protected void paintComponent(Graphics gx){
super.paintComponent(gx);
if(data!=null){
setDefaultFonts(gx);
determineBounds();
paintAxis(gx);
if(data!=null && data.numInstances()>0){
if(record == null){
paintData(gx);
} else{
record.drawFromZeroToActual();
}
}
}
}
}