[Java] Repintar una figura y utilizar un ArrayList en un JFrame [Resuelto]

Iniciado por Ahinoam, 28 Noviembre 2017, 20:32 PM

0 Miembros y 1 Visitante están viendo este tema.

Ahinoam

Hola, estoy realizando un pequeño programa que al hacer clic en el panel se dibuje un circulo y que cuando vuelva a dar clic se dibuje otro circulo pero, sin que se borre el primer circulo y que el segundo circulo cambie de color.

Lo que tengo hasta ahora es el puro Frame, con el circulo y cuando hago clic, dibuja otro circulo de otro color, pero se borra el primer circulo. He estado viendo un sin fin de vídeos tutoriales, visitando muchas paginas, pero solamente me confundo.


Mi código es el siguiente:
Código (java) [Seleccionar]

package Graficos;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Graficos2D {
public static void main(String[] args) {
Marco NewMarco = new Marco();
NewMarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class Marco extends JFrame {
int x;
       int y;
       int radio;
public Marco() {
setVisible(true);
setSize(500,500);
x = getSize().width/2;
               y = getSize().height/2;
setTitle("Dibujando Circulos");
       addMouseListener(new MouseAdapter(){
           @Override
           public void mouseClicked(MouseEvent e) {
               super.mouseMoved(e);
               x=e.getX();
               y=e.getY();
               repaint();
           }
       });
}
@Override
public void paint(Graphics g) {
super.paint(g);
               radio = 25;
Random r = new Random();
Graphics2D g2=(Graphics2D) g;
g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
Ellipse2D circulo=new Ellipse2D.Float(x-radio, y-radio, radio*2, radio*2);
g2.fill(circulo);
}
       class EventoMouse {
           public EventoMouse(){
           }
       }
}


Tengo el evento mouseClicked, pero no almacena los círculos nuevos, vi que se puede hacer con un ArrayList. Entiendo como debería funcionar, pero no se como implementarlo a mi código.

Realmente espero y me puedan ayudar

ivancea96

Sin ir más lejos, lo evidente:
Código (csharp) [Seleccionar]
Graphics2D g2=(Graphics2D) g;
g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
Ellipse2D circulo=new Ellipse2D.Float(x-radio, y-radio, radio*2, radio*2);
g2.fill(circulo);

Estás pintando 1 círculo.

Si quieres pintar 2 cídruclos, tendrás que ponerlo.
Si quieres pintar indefinidos círculos, tendrás que hacerlo con ciclos, como for.

Lo primero: ¿Trabajaste alguna vez con ArrayList, LinkedList, List o arrays? Si la respuesta es no, es lo primero, antes de mezclarlo con los gráficos.
Si ya has trabajado con alguno, entoncces la dinámica es: En el evento de click, almacenar un nuevo punto (x,y) en el array/lista. En paint(), recorrer la lista y dibujarlos todos.
Son 2 pasos bien diferenciados, obtener datos y utilizar esos datos. Empieza por ahí.

Acerca de almacenar los puntos, puedes crear una clase "Punto{ int x; inty; }".

Ahinoam

Cita de: ivancea96 en 29 Noviembre 2017, 20:10 PM
Sin ir más lejos, lo evidente:
Código (csharp) [Seleccionar]
Graphics2D g2=(Graphics2D) g;
g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
Ellipse2D circulo=new Ellipse2D.Float(x-radio, y-radio, radio*2, radio*2);
g2.fill(circulo);

Estás pintando 1 círculo.

Si quieres pintar 2 cídruclos, tendrás que ponerlo.
Si quieres pintar indefinidos círculos, tendrás que hacerlo con ciclos, como for.

Lo primero: ¿Trabajaste alguna vez con ArrayList, LinkedList, List o arrays? Si la respuesta es no, es lo primero, antes de mezclarlo con los gráficos.
Si ya has trabajado con alguno, entoncces la dinámica es: En el evento de click, almacenar un nuevo punto (x,y) en el array/lista. En paint(), recorrer la lista y dibujarlos todos.
Son 2 pasos bien diferenciados, obtener datos y utilizar esos datos. Empieza por ahí.

Acerca de almacenar los puntos, puedes crear una clase "Punto{ int x; inty; }".

Gracias por responder ivan, respondiendo a tus preguntas:
1: No, no he trabajado con ArrayList.
2: Ya he estado probando diferentes formas, pero no me queda, tambien lo he intentado con los vectores, que es muy parecido el funcionamiento del ArrayList (por lo que he investigado).

Sigo haciendo pruebas para que funcione,  realmente no estoy esperando que la respuesta me caiga del cielo, así que si conoces un tutorial o una pagina donde pueda entender esto (hablando de implementarlo en la forma que quiero, porque ya se que, para que funcione el ArrayList se debe de llamar a la clase en donde quiere almacenar los objetos)

Gracias por tu respuesta, seguiré buscando la manera de implementarlo en mi codigo.

PabloPbl

Como te dijo ivancea96,
Cuando se haga click que se guarde las coordenadas en un ArrayList, por cada elemento del arrayList se guardara un array de int, el cual contendra como primero valor la X y luego la Y, o bien puedes optar por crear una clase, Coordenada y obtenerlo desde una instancia.

Luego en el método paint, recorreras todo el arrayList con las coordenadas que se fue registrando.

Prueba este código:

Código (java) [Seleccionar]

package Graficos;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Graficos2D {
   
public static void main(String[] args) {
           
Marco NewMarco = new Marco();
NewMarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class Marco extends JFrame {
   
    ArrayList<Integer[]> coordenadas;
   
int x;
        int y;
        int radio;
       
public Marco() {
            this.coordenadas = new ArrayList<Integer[]>();
setVisible(true);
setSize(500,500);
x = getSize().width/2;
                y = getSize().height/2;
setTitle("Dibujando Circulos");
        addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseMoved(e);
                coordenadas.add(new Integer[]{x=e.getX(), y=e.getY()});
                repaint();
            }
        });
}
@Override
public void paint(Graphics g) {
super.paint(g);
                radio = 25;
Random r = new Random();
Graphics2D g2=(Graphics2D) g;
g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
                for(int i = 0; i < coordenadas.size(); i++) {
                    Ellipse2D circulo=new Ellipse2D.Float(coordenadas.get(i)[0]-radio, coordenadas.get(i)[1]-radio, radio*2, radio*2);
                    g2.fill(circulo);
                }
}
        class EventoMouse {
            public EventoMouse(){
            }
        }
}


Si quieres que los colores de cada circulo quede como era originalmente, deberás crear una clase que guarde dichos valores para luego ser pintado con el color que le corresponde a cada circulo, eso ya te lo dejo para ti.

Muchas gracias por comunicarse con foro el hacker que tenga buen día señor.

Ahinoam

#4
Enserio agradezco tu ayuda PabloPbl y a ivancea96, por su ayuda, ahora ya entiendo como implementar el arraylist, ya que el arraylist no trabaja con datos abstractos. Pero yo cometí un gran error, después de muchas vueltas, me corrigieron en un foro en ingles, el error es que yo agregue el método super.paint y este me repintaba los círculos, borrando el anterior, así que solo lo elimine, y agregue un panel. Ahora ya se como hacer estos tipos de trabajos de dos formas.

El código final:
Código (java) [Seleccionar]

package examenfinal;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MetodoNo1 {
   public static void main(String[] args){
       Marco NewMarco = new Marco();
       JPanel panel=new JPanel();
       NewMarco.setContentPane(panel);
   }
}
class Marco extends JFrame {
       int x;
       int y;
       int radio;
public Marco() {
setVisible(true);
setSize(500,500);
               x = getSize().width/2;
               y = getSize().height/2;
setTitle("Dibujando Circulos");
               addMouseListener(new MouseAdapter(){
                   @Override
                   public void mouseClicked(MouseEvent e) {
                       super.mouseMoved(e);
                       x=e.getX();
                       y=e.getY();
                       repaint();
                   }
               });
}
       @Override
public void paint(Graphics g) {
               radio = 25;
Random r = new Random();
Graphics2D g2=(Graphics2D) g;
g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
               AlphaComposite AlpComp=AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);
               g2.setComposite(AlpComp);
Ellipse2D circulo=new Ellipse2D.Float(x-radio, y-radio, radio*2, radio*2);
g2.fill(circulo);
}
       class EventoMouse {
           public EventoMouse(){
           }
       }
}

Doy por resuelto el tema, gracias por la ayuda.
Fue divertido y estresante hacer el codigo