Hola, buenos días.
Estoy haciendo una especie de animación simulada con java y resulta que soy algo nuevo en esto de la programación gráfica, por lo que tengo muchas dudas. Voy a intentar subiros los fragmentos de código que me generan más dudas de la manera más resumida posible para ver si podéis echarme una mano, ya que el programa no funciona. Gracias a todos y todas de antemano.
Pues bien, la simulación lo que tiene que hacer es dibujar unos círculos en un panel que se deben ir moviendo según unos parámetros booleanos que introducimos en unas casillas de activación. El número de círculos que se deben dibujar se introducen en un cuadro de texto. En este enlace hay un vídeo con el resultado que debo conseguir.
Lo que creo que debo hacer es definir:
Una clase vector con las operaciones básicas que se pueden hacer con los vectores en dos dimensiones. Esto va bien.
Una clase circulo con los atributos de cada uno de los círculos (diámetro, color, posición, velocidad, aceleración), con un método pintar que dibuje un círculo a partir de un objeto de la clase graphics y otro método actualizar que en cada iteración actualice la posición de un círculo según sus propios atributos. También contiene otros métodos. Esto creo que también va más o menos bien.
Una clase Panel, que debe ser un panel gráfico sensible a los movimientos del ratón que contenga como atributos una colección de círculos y los datos de la IGU. Aquí empiezan mis problemas. Entiendo, en un principio, que Panel podría ser una subclase de java.awt.graphics2D y que podría utilizar la interfaz MouseMotionListener.
Un programa principal que contenga la definición y comportamiento de la interfaz. Mi idea es hacer esto con una subclase de JFrame, pero también ando algo perdido con esto.
Bueno, ahí va lo que en un principio había concebido para la clase Panel. Lo que ocurrió es me surgieron muchos problemas y lo fui modificando. Entre esos problemas, el NetBeans me obligaba a poner un abstract en la declaración de la clase. Pero no me daba buena espina eso, por lo que también fui probando con la clase java.awt.Canvas sin conseguir mucho. En cualquier caso, me gustaría hacerlo con graphics2D:
Y ahora un esbozo de la clase principal. Creo que aquí es donde la lío más. Me gustaría hacerlo con un JFrame, aunque si tuviese que cambiar de clase no me importaría con tal de que el programa funcionase. Esto lo fui también modificando de una manera un tanto arbitraria, pero nada. Ni siquiera fui capaz de visualizar el panel:
A ver qué os parece. Yo estoy bastante perdido y falto de ideas.
Muchísimas gracias de antemano por vuestro tiempo.
Estoy haciendo una especie de animación simulada con java y resulta que soy algo nuevo en esto de la programación gráfica, por lo que tengo muchas dudas. Voy a intentar subiros los fragmentos de código que me generan más dudas de la manera más resumida posible para ver si podéis echarme una mano, ya que el programa no funciona. Gracias a todos y todas de antemano.
Pues bien, la simulación lo que tiene que hacer es dibujar unos círculos en un panel que se deben ir moviendo según unos parámetros booleanos que introducimos en unas casillas de activación. El número de círculos que se deben dibujar se introducen en un cuadro de texto. En este enlace hay un vídeo con el resultado que debo conseguir.
Lo que creo que debo hacer es definir:
Una clase vector con las operaciones básicas que se pueden hacer con los vectores en dos dimensiones. Esto va bien.
Una clase circulo con los atributos de cada uno de los círculos (diámetro, color, posición, velocidad, aceleración), con un método pintar que dibuje un círculo a partir de un objeto de la clase graphics y otro método actualizar que en cada iteración actualice la posición de un círculo según sus propios atributos. También contiene otros métodos. Esto creo que también va más o menos bien.
Una clase Panel, que debe ser un panel gráfico sensible a los movimientos del ratón que contenga como atributos una colección de círculos y los datos de la IGU. Aquí empiezan mis problemas. Entiendo, en un principio, que Panel podría ser una subclase de java.awt.graphics2D y que podría utilizar la interfaz MouseMotionListener.
Un programa principal que contenga la definición y comportamiento de la interfaz. Mi idea es hacer esto con una subclase de JFrame, pero también ando algo perdido con esto.
Bueno, ahí va lo que en un principio había concebido para la clase Panel. Lo que ocurrió es me surgieron muchos problemas y lo fui modificando. Entre esos problemas, el NetBeans me obligaba a poner un abstract en la declaración de la clase. Pero no me daba buena espina eso, por lo que también fui probando con la clase java.awt.Canvas sin conseguir mucho. En cualquier caso, me gustaría hacerlo con graphics2D:
Código [Seleccionar]
public class Panel extends java.awt.graphics2D implements MouseMotionListener
{
//Atributos de la clase. No creo que tenga problemas aquí.
circulo bolas[]; // Un array con las bolas;
int nbolas; // El número de bolas
boolean follow_mouse // Nos indica si la casilla Follow Mouse está activada o no.
//...
//Luego el constructor.
public Panel (int Nbolas, boolean walls, boolean mouse, int ancho, int alto)
{
setSize(ancho, alto); // Dimensiono el panel
bolas = new circulo (...); // Reservo memoria para el array de círculos y construyo
//esos círculos según el constructor de esa clase.
// Y otras cosas así
//...
}
//...
public void paintComponent (Graphics g)
{
//Aquí hay un bucle en el que llamo al método [b]pintar [/b] para cada uno de los
//circulos del array introduciéndolo el arguento g.
}
public void actualizarBolas (void);
{
//Aquí hay un bucle en el que llamo al método [b]actualizar[/b] para cada uno de
//los circulos del array
}
//Los métodos de la interfaz.
//Cuando el ratón se mueva y en el caso de que la casilla Follow Mousse esté activada
//se debe cambiar el centro del movimiento
public void mouseDragged (MouseEvent e)
{
if (follow_mouse==1)
{
Centro.cambiarx(e.getX());
Centro.cambiary(e.getY());
}
}
public void mouseDragged (MouseEvent e) {}
}
Y ahora un esbozo de la clase principal. Creo que aquí es donde la lío más. Me gustaría hacerlo con un JFrame, aunque si tuviese que cambiar de clase no me importaría con tal de que el programa funcionase. Esto lo fui también modificando de una manera un tanto arbitraria, pero nada. Ni siquiera fui capaz de visualizar el panel:
Código [Seleccionar]
public class app extends JFrame implements ItemListener, ActionListener
{
//Atributos:
JCheckBox check1, check2;
JTextField text;
Panel p;
Graphics g;
//Constructor. No creo que esto esté bien:
public app()
{
p=new Panel(....) // Construyo el panel con unos parámetros adecuados.
Container c=getContentPane();
check1=new JCheckBox("With walls");
check2=new JCheckBox("Follow mouse");
text=new JTextField (20);
check1.addItemListener(this);
check2.addItemListener(this);
text.addActionListener(this);
c.add(check1);
c.add(check2);
c.add(p);
}
//Los métodos de las interfaces:
public void itemStateChanged (ItemEvent e)
{
if (e.getItemSelectable==check1)
{
p.cambiarWalls(check1.isSelected());
}
if (e.getItemSelectable==check2)
{
p.cambiarMouse(check2.isSelected());
}
}
public void actionPerformed (ActionEvent e)
{
if (e.getSource==text)
{
//Aquí obtengo el texto que hay en el cuadro, lo paso a un int y vuelvo a
//construir el panel p con los parámetros actuales.
}
}
// El main.
public static void main (String args[])
{
final JFrame f=new app();
fsetBounds(50,50,500,500);
f.setVisible(true);
// Y ahora el bucle que crea la simulación. No estoy seguro de que esto vaya aquí,
// pero no sé dónde meterlo... :)
while (1==1)
{
p.paintComponent(g);
p.actualizarBolas();
p.repaint();
}
}
}
A ver qué os parece. Yo estoy bastante perdido y falto de ideas.
Muchísimas gracias de antemano por vuestro tiempo.