Antes de nada quisiera aclarar que soy algo nuevo en el foro y tengo poca experiencia en cuanto a exponer dudas sobre códigos. He estado sobre esto en alguno de los posts que hay en el foro y agradezco cualquier sugerencia que me hagáis encaminada a conseguir que ayudarme sea una tarea sencilla.
Hace unos días publiqué una duda en este hilo. Abro un nuevo hilo para ver si resulta algo más interesante y también para comentar que la cosa ha ido avanzando, aunque todavía me queda un pequeño problema por solucionar. Vuelvo a enlazar aquí un vídeo con un ejemplo con lo que debo conseguir. Aquí va el código completo de las clases que he creado para el ejercicio:
Clase Aplicacion:
Código
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package practica.pkg2; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JTextField; /** * * @author joseb */ /** * */ public Aplicacion(){ Check1.addItemListener(this); Check2.addItemListener(this); Text.addActionListener(this); getContentPane().setLayout(null); getContentPane().add(Text); Text.setBounds(20,20,250,30); getContentPane().add(Check1); Check1.setBounds(20, 70, 250, 30); getContentPane().add(Check2); Check2.setBounds(20, 120, 250, 30); } }); } @Override if(E.getItemSelectable()==Check1){ } if(E.getItemSelectable()==Check2){ if (Check2.isSelected()==false) { } } } /** * * @param A */ @Override if (A.getSource()==Text) { vector c=new vector (0,0); getContentPane().setLayout(null); } } { } /** * * @param Args */ final Aplicacion F = new Aplicacion(); F.setBounds(0, 0, 1300, 800); F.setVisible(true); while (1==1) { F.bucle(); F.setVisible(true); } } }
Clase PanelCercles
Código
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package practica.pkg2; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.io.IOException; import javax.swing.JPanel; /** * * @author joseb */ private Cercle[] bolas; private int Nbolas; private boolean with_walls; private boolean followmouse; private vector centro; private int alto; private int ancho; public PanelCercles(int Nbols, boolean walls, boolean mouse, int alt, int anch, vector cen){ vector v,p,a; centro=new vector (cen.obtenerx(),cen.obtenery()); followmouse=mouse; with_walls=walls; alto=alt; ancho=anch; setSize(ancho,alto); a=new vector(0,1); Nbolas=Nbols; bolas= new Cercle[Nbolas]; for (int i =0;i<Nbolas;i++){ bolas [i]=new Cercle(20,a,v,c,p); } addMouseMotionListener(this); } /** * * @param G */ @Override G.fillRect(0, 0, 1500,1500); for(int i=0;i<Nbolas;i++){ bolas[i].dibujar(G,true); } for(int i=0;i<Nbolas;i++){ bolas[i].dibujar(G,false); } } for (int i=0;i<Nbolas;i++){ bolas[i].actualizar(alto, ancho, with_walls, followmouse, centro); //System.out.printf("Centro: ("+obtCentro().obtenerx()+","+obtCentro().obtenery()+")\n\n"); //System.out.printf("Has actualizado la bola "+i+" "+followmouse+"\n"); } } @Override @Override //System.out.printf("Estas moviendo el ratón: "+followmouse+"\n"); if(followmouse==true){ //System.out.printf("Entras??\n"); centro.cambiarx(e.getX()); centro.cambiary(e.getY()); } } public void cambiar_mouse(boolean m){ followmouse=m; } public void cambiar_walls(boolean w){ with_walls=w; } public void reiniciarAceleraciones() { for (int i=0;i<Nbolas;i++){ bolas[i].initAceleracion(); } } public vector obtCentro() { return centro; } // public boolean obtFollowm() { return followmouse; } }
Clase Cercle
Código
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package practica.pkg2; import java.awt.Color; import java.awt.Graphics; /** * * @author joseb */ public class Cercle { private int diametre; private vector velocitat; private vector acceleracio; private vector posicio; private vector anterior; diametre= diam; col=color; posicio=pos; acceleracio=accel; velocitat=vel; anterior=new vector(0,0); } public void controlar(int alto,int ancho,boolean with_walls){ boolean sentido=false; if (velocitat.obtenerx()>=0) { sentido=true; } if(posicio.obtenerx()>ancho && with_walls==false){ posicio.cambiarx(posicio.obtenerx()-ancho); } if(posicio.obtenerx()<0 && with_walls==false){ posicio.cambiarx(posicio.obtenerx()+ancho); } if(posicio.obtenery()>alto && with_walls==false){ posicio.cambiary(posicio.obtenery()-alto); } if(posicio.obtenery()<0 && with_walls==false){ posicio.cambiary(posicio.obtenery()+alto); } if(posicio.obtenerx()>ancho && with_walls==true){ posicio.cambiarx(-posicio.obtenerx()+2*ancho); velocitat.cambiarx(-velocitat.obtenerx()); } if(posicio.obtenerx()<0 && with_walls==true){ posicio.cambiarx(-posicio.obtenerx()); velocitat.cambiarx(-velocitat.obtenerx()); } if(posicio.obtenery()>alto && with_walls==true){ posicio.cambiary(-posicio.obtenery()+2*alto); velocitat.cambiary(-velocitat.obtenery()); } if(posicio.obtenery()<0 && with_walls==true){ posicio.cambiary(-posicio.obtenery()); velocitat.cambiary(-velocitat.obtenery()); } if (velocitat.limitaciomod(20)) { if (sentido&&velocitat.obtenerx()==0) { velocitat.cambiarx(2); } if (!sentido&&velocitat.obtenerx()==0) { velocitat.cambiarx(-2); } } } public void actualizar(int alto,int ancho,boolean with_walls,boolean followmouse,vector puntero){ double k=0.1; anterior.cambiarx(posicio.obtenerx()); anterior.cambiary(posicio.obtenery()); if(followmouse){ acceleracio.cambiarx(puntero.obtenerx()); acceleracio.cambiary(puntero.obtenery()); acceleracio.resta(posicio); acceleracio.multiplicacion(k); } velocitat.suma(acceleracio); posicio.suma(velocitat); controlar(alto,ancho,with_walls); } if(blanco==true){ pincel.setColor(d); pincel.fillOval(anterior.obtenerx(), anterior.obtenery(), diametre, diametre); pincel.drawOval(anterior.obtenerx(), anterior.obtenery(), diametre, diametre); } else{ pincel.setColor(col); pincel.fillOval(posicio.obtenerx(), posicio.obtenery(), diametre, diametre); pincel.setColor(c); pincel.drawOval(posicio.obtenerx(), posicio.obtenery(), diametre, diametre); } } public vector obtenerAceleracion () { return acceleracio; } public vector obtenerVelocidad (){ return velocitat; } public vector obtenerPosicion(){ return posicio; } public vector obtenerAnterior(){ return anterior; } public void initAceleracion() { acceleracio=new vector(0,1); } }
Clase vector
Código
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package practica.pkg2; /** * * @author joseb */ public class vector { private int x; private int y; public vector(int posx, int posy){ x=posx; y=posy; } vector() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } public void suma(vector a){ x=a.x+x; y=a.y+y; } public void resta(vector a){ x=x-a.x; y=y-a.y; } public void multiplicacion(double k){ x=(int) (k*x); y=(int) (y*k); } public void division(double k){ x=(int) (x/k); y=(int) (y/k); } public double modulo(){ return sqrt(x*x+y*y); } public void unitari(){ division(modulo()); } public boolean limitaciomod(double Max){ if(modulo()>Max){ multiplicacion(Max/modulo()); return true; } return false; } /* public void limitaciox(int with_walls,int ancho){ if(x>ancho) }*/ public int obtenerx(){ return x; } public int obtenery(){ return y; } public void cambiarx(int nueva){ x=nueva; } public void cambiary(int nueva){ y=nueva; } }
El programa empieza bien. Responde correctamente al cambio de estado de las casillas de activación y al movimiento del puntero del ratón sobre el panel de bolas. Cuando en el cuadro de texto cambio del número de bolas también hace lo correcto, es decir, crear un nuevo panel con ese número de bolas y las visualiza correctamente. No obstante, después de cambiar ese parámetro, el programa no responde bien al cambio de estado de la casilla de activación "Follow mouse".
No alcanzo a entender dónde está el problema. Creo que está relacionado con la gestión de eventos de ratón. En concreto el método mouseMoved de la clase PanelCercles funciona de una manera un tanto aleatoria. Sí que se ejecuta cuando toca, pero el parámetro booleano followmouse lo lee de manera un tanto aleatoria (o eso es lo que a mí, dentro de mi ignorancia, me parece). Además, cuando lo lee como true entra en el condicional para cambiar el parámetro centro pero no lo hace. Insisto en que el problema sólo aparece después de cambiar, al menos una vez, el número de bolas en el cuadro de texto correspondiente.
He puesto una serie de "printf"s ocultos al compilador para que si ejecutáis el código y quitáis las barras // veáis lo que os digo. Esos "printf"s están en las líneas 81, 82, 92 y 94 de la clase PanelCercles.
El primero de ellos es para mostrar que el atributo centro no cambia.
El segundo es para mostrar que en este punto del código el atributo followmouse es correcto. Es decir, corresponde con el estado de la casilla de activación "Follow mouse".
El tercero es para mostrar que en este punto el atributo followmouse puede cambiar en relación al punto anterior. Su estado aquí es aleatorio, a veces toma el valor true y a veces el valor false, y no cambia con el estado de la casilla de activación correspondiente.
El cuarto es para mostrar que a veces entra en el condicional en el que se debería cambiar el atributo centro, pero como se ve en el primer "printf" no lo hace.
En fin, estoy algo perdido con esto. ¿Cómo lo veis vosotros? ¿Tenéis alguna sugerencia o idea. Utilizo el NetBeans en un Windows 10.
Agradezco de antemano cualquier tipo de comentario o de ayuda. Un saludo.