Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Kenzo en 29 de Noviembre 2017, 01:51

Título: Dibujar más de una figura circulos en Java con Ellipse2D JFrame Graphics2D tapiz
Publicado por: Kenzo en 29 de Noviembre 2017, 01:51
Hola, estoy haciendo un pequeño programa en java el cual es que, cuando hagamos clic izquierdo sobre el Frame se dibuje un circulo, y al hacer otra vez clic se dibuje otro circulo, pero que el primer circulo no se borre y el segundo circulo cambie de color, y así hasta tapizar el Frame de círculos de diferentes colores.

Tengo el 80% del programa hecho, a excepción de que se almacenen los círculos.


Código del programa:

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(){
            }
        }
}


He estado investigando cómo hacer, pero no mas salgo confundido . . . Sé que se puede hacer con un ArrayList, pero no logro hacer que funciones.

Realmente espero y me puedan ayudar.
Título: Re:Dibujar más de una figura circulos en Java con Ellipse2D JFrame Graphics2D tapiz
Publicado por: Ogramar en 06 de Junio 2018, 19:01
Buenas, hay varias formas de resolver la cuestión de no perder lo dibujado una vez se añaden elementos a un dibujo en Java. Aquí dejo un código que muestra una posible solución, aunque no digo que esta sea la única (ni la mejor).

Código: [Seleccionar]

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 MyPanel extends JPanel implements MouseListener
{
    private ArrayList<Point> points = new ArrayList<>();

    public MyPanel() {
        super();
        addMouseListener(this);
    }

    @Override public void mouseEntered(MouseEvent e) { }

    @Override public void mouseExited(MouseEvent e) { }

    @Override public void mouseClicked(MouseEvent e) { }

    @Override public void mousePressed(MouseEvent e) { }

    @Override public void mouseReleased(MouseEvent e) {
        points.add(new Point(e.getX(), e.getY()));
        repaint();
    }

    @Override public void paint(Graphics g) {
        super.paint(g);
        for (Point p : points)
            g.fillOval(p.getX(), p.getY(), 10, 10);
    }
   
    public static void main(String[] args) {
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setLocationRelativeTo(null);

    MyPanel myPanel = new MyPanel();

    frame.add(myPanel);
    frame.setVisible(true);
}
}

class Point
{
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

Salu2