Java 2D - Criando dois objetos a partir de um botão

Boa Noite a todos…
Estou iniciando meus estudos em Java 2D por motivos de forças maiores (TCC), e me deparei com um problema…

tenho duas classes…uma que eh a minha tela, e a outra…Círculo…
na classe tela, eu desenho um circulo quando eu aperto o botão, e posso movê-lo atraves do frame quando clico em cima dele e ateh coloco uns efeitos no meu círculo.
Porém quando aperto de novo no botão, eu queria que fosse criado outro círculo, e não é o q acontece…ele simplesmente redesenha o mesmo círculo na posição que eu setei anteriormente!
naum sei se o problema aqui eh em falta de experiencia em Java2d ou em java mesmo! hehehe

pensei em naum utilizar o método paint, criando um método específico, mas nao funciona tbem. Tentei criar o objeto dentro do proprio metodo, porém daih naum consigo fazer o tratamento do mouse sobre o circulo…

como resolvo o problema de criar mais de um objeto circulo com o meu botão?!

[code]import java.awt.Graphics;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.;
import java.awt.event.
;
import javax.swing.*;

public class Tela extends JFrame implements ActionListener, MouseListener, MouseMotionListener
{
// Objeto Círculo
private Circulo circulo;

// Container

private Container caixa;

// Botão da tela
private JButton botao;

// Variáveis utilizadas
private double posX;
private double posY;
private boolean desenha;
private boolean mouseSobreDesenho;
private boolean selecionado;

public Tela()
{
// Iniciando as variáveis
circulo = null;
desenha = false;
mouseSobreDesenho = false;
selecionado = false;

// Iniciano Container
	getContentPane().setBackground(Color.WHITE);
 	caixa = getContentPane();
	caixa.setLayout(null);
	
	// Iniciando Botão
	botao = new JButton("Aperte");
	caixa.add(botao);
	botao.addActionListener(this);
	
	botao.setBounds(20, 20, 100, 30);
	 
	// Setando configurações da tela
	setSize(500, 500);
	setVisible(true);
	
	// Adicionando eventos do mouse
	addMouseListener(this);
	addMouseMotionListener(this);
}

public void paint(Graphics g)
{
super.paint(g);

	circulo = new Circulo(posX, posY);
	
	circulo.draw(desenha, selecionado, (Graphics2D)g);

}

// Controla os eventos do clique do mouse

public void mouseClicked(MouseEvent e)
{
if (((e.getX() > circulo.getPosx()) && (e.getY() > circulo.getPosy()))
&& ((e.getX() < (circulo.getWidth() + circulo.getPosx())) && (e.getY() <
(circulo.getHeigth() + circulo.getPosy())))) {
selecionado = true;
repaint();
}
else{
selecionado = false;
repaint();
}
}

// Método que é acionado quando você passa com o mouse por cima do componente
// que está sendo implementado o MouseListener
public void mouseEntered(MouseEvent e)
{

}

// Método que é acionado quando você retira o mouse de cima do componente
// que está sendo implementado o MouseListener
public void mouseExited(MouseEvent e)
{

}

// Método que é acionado quando você pressiona o mouse em cima do componente
// que está sendo implementado o MouseListener   
public void mousePressed(MouseEvent e)
 {
	// Verifica se cliquei em cima da área do círculo
	if (((e.getX() > circulo.getPosx()) && (e.getY() > circulo.getPosy()))
	    	&& ((e.getX() < (circulo.getWidth() + circulo.getPosx())) && (e.getY() <
	    	(circulo.getHeigth() + circulo.getPosy())))) {
		mouseSobreDesenho = true;
		repaint();
	}  
}

// Método que é acionado quando você solta o click do mouse
public void mouseReleased(MouseEvent e) {
	// Indica que soltei o mouse seja onde eu estiver...
	mouseSobreDesenho = false;
	repaint();
}

public void mouseDragged(MouseEvent e){
	// Somente faço isso caso eu tenha clicado em cima do círculo e não tenha soltado o mesmo
	if (mouseSobreDesenho) 
	{
		// Redefino as novas posições do círculo, e seto a variável para se desenhar
		posX = e.getX() - (circulo.width / 2.0);
		posY = e.getY() - (circulo.heigth / 2.0);
		desenha = true;
		selecionado = true;
	}
	else{
		selecionado = false;
	}
	repaint();
}

public void mouseMoved(MouseEvent e)
{
	
}

public void actionPerformed(ActionEvent e)
{
	// Desenho caso eu aperte este botão, colocando nas posições x e y pré-definidas
	if(e.getSource() == botao){
		posX = 100.0;
		posY = 100.0;
		desenha = true;
		repaint();
	}	
}
 
public static void main(String args[])
{
	Tela obj = new Tela();
	obj.setDefaultCloseOperation(EXIT_ON_CLOSE);
}	

}
[/code]

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;

public class Circulo
{
	public double width;
	public double heigth;
	public double x;
	public double y;

	public Circulo(double posX, double posY)
	{
		width = 50.0;
		heigth = 50.0;
		x = posX;
		y = posY;
	}

	public void draw(boolean desenha, boolean selecionado, Graphics2D g2)
	{
		Ellipse2D.Double myEllipse = new Ellipse2D.Double(x, y, width, heigth);
		
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);

		if(selecionado){
			g2.setStroke(new BasicStroke(6));
			g2.setPaint(Color.cyan);
			g2.fill(myEllipse);
			g2.setPaint(Color.lightGray);
		}
		else{
			g2.setStroke(new BasicStroke(4));
			g2.setPaint(Color.white);
			g2.fill(myEllipse);
			g2.setPaint(Color.GRAY);
		}
		
		// Somente desenho caso a minha flag "desenha" esteja setada como true
		if(desenha){
			g2.draw(myEllipse);
		}
	}
	
// Métodos get //
//----------------------------------------------------------------------------------------//
	public Double getPosx() {
		return x;
	}

	public Double getPosy() {
		return y;
	}

	public Double getWidth() {
		return width;
	}

	public Double getHeigth() {
		return heigth;
	}
//----------------------------------------------------------------------------------------//
	
// Métodos set //
//----------------------------------------------------------------------------------------//
	public void setPosx(double newPosx) {
		x = newPosx;
	}

	public void setPosy(double newPosy) {
		y = newPosy;
	}

	public void setWidth(double newWidth) {
		width = newWidth;
	}

	public void setHeigth(double newHeigth) {
		heigth = newHeigth;
	}
//----------------------------------------------------------------------------------------//
}

O código está um pouco confuso…joguei umas flags, como desenha, selecionado…mas creio q dê pra entender pelo menos a minha dúvida! heheh

Obrigado!

Cara no metodo paint() tira o super.paint() que vc vai conseguir o quer…
se eu nao me engano quando vc usa super.paint() ele repinta o painel e sem ele somente pinta novamente

Intao…
se eu tirar o super.paint(), eu deixo de herdar da classe paint num eh isso?!
e tirando essa linha, ele naum redesenha meu circulo conforme o movimento do mouse…simplesmente ele desenha um monte deles, deixando um “rastro” de varios circulos por onde eu movimentei o circulo. Fora que quando eu aperto o botao, ele redesenha outro circulo, e os outros ficam desenhados ainda no meu frame, sem o mouselistener, ou seja, uma simples circunferencia que naum se movimenta…

Pense logicamente. Como você vai desenhar 2 círculos, com 1 única variável círculo?

Não vai, concorda?

O que você tem que fazer é criar uma lista de todos os circulos desenhados na tela:

E então alterar seu código para trabalhar com a lista. Por exemplo, o método paint terá que pintar todos os circulos cadastrados:

public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); for (Circulo circulo : circulos) { circulo.draw(desenha, selecionado, g2d); } g2d.dispose(); }

Você terá que repensar sua função mouseClicked. Provavelmente o status de seleção e o teste se o clique foi no circulo ou não irão para dentro da classe Circulo.

humm…

realmente naum fazia sentido mesmo o meu código…mas naum tinha nem sequer pensado nisso antes! hehe

Modifiquei meu código de acordo com as suas dicas…e ficou assim…

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

public class Tela extends JFrame implements ActionListener, MouseListener, MouseMotionListener
{
	
	private ArrayList<Circulo> circulos;
	
	// Container
  	private Container caixa;
   	
   // Botão da tela
   private JButton botao;
   	
   // Variáveis utilizadas
   private double posX;
   private double posY;
   private boolean desenha;
   private boolean mouseSobreDesenho;
   private boolean selecionado;
	 
   public Tela()
	{
   	// Iniciando as variáveis
   	circulos          = new ArrayList<Circulo>();
   	desenha           = false;
   	mouseSobreDesenho = false;
   	selecionado       = false;
   		
   	// Iniciano Container
		getContentPane().setBackground(Color.WHITE);
	 	caixa = getContentPane();
		caixa.setLayout(null);
		
		// Iniciando Botão
		botao = new JButton("Aperte");
		caixa.add(botao);
		botao.addActionListener(this);
		
		botao.setBounds(20, 20, 100, 30);
		 
		// Setando configurações da tela
		setSize(500, 500);
		setVisible(true);
		
		// Adicionando eventos do mouse
		addMouseListener(this);
		addMouseMotionListener(this);
	}
    
   public void paint(Graphics g)
   {
    	Graphics2D g2d = (Graphics2D) g.create();
		
    	for(Circulo circulo : circulos){
    		circulo.draw(desenha, selecionado, (Graphics2D)g);
    	}
    	
		g2d.dispose();
    }
    
	 // Controla os eventos do clique do mouse
	 public void mouseClicked(MouseEvent e)
    {
	 	for(Circulo circulo : circulos){
    		if(circulo.verificaMouseDentroDoCirculo(e.getX(), e.getY())){
    			selecionado = true;
    			repaint();
    		}
    		else{
    			selecionado = false;
    			repaint();
    		}
    	}
    }
    
    // Método que é acionado quando você passa com o mouse por cima do componente
    // que está sendo implementado o MouseListener
    public void mouseEntered(MouseEvent e)
    {
    	
    }
    
    // Método que é acionado quando você retira o mouse de cima do componente
    // que está sendo implementado o MouseListener
    public void mouseExited(MouseEvent e)
    {
    
    }
    
    // Método que é acionado quando você pressiona o mouse em cima do componente
    // que está sendo implementado o MouseListener
      
    public void mousePressed(MouseEvent e)
	 {
    	for(Circulo circulo : circulos){
    		if(circulo.verificaMouseDentroDoCirculo(e.getX(), e.getY())){
    			mouseSobreDesenho = true;
    			repaint();
    		}
    	}
    }
    
    // Método que é acionado quando você solta o click do mouse
    public void mouseReleased(MouseEvent e) {
    	// Indica que soltei o mouse seja onde eu estiver...
    	mouseSobreDesenho = false;
    	repaint();
    }
    
    public void mouseDragged(MouseEvent e){
    	// Somente faço isso caso eu tenha clicado em cima do círculo e não tenha soltado o mesmo
    	if (mouseSobreDesenho) 
    	{
    		for(Circulo circulo : circulos){
        		if(circulo.verificaMouseDentroDoCirculo(e.getX(), e.getY())){
        			// Redefino as novas posições do círculo, e seto a variável para se desenhar
            		posX = e.getX() - (circulo.width / 2.0);
            		posY = e.getY() - (circulo.heigth / 2.0);
            		desenha = true;
            		selecionado = true;
            		repaint();
        		}
        	}
    	}
    	else{
    		selecionado = false;
    	}
    	//repaint();
    }
    
	public void mouseMoved(MouseEvent e)
	{
		
	}
	
	public void actionPerformed(ActionEvent e)
	{
		// Desenho caso eu aperte este botão, colocando nas posições x e y pré-definidas
		if(e.getSource() == botao){
			circulos.add(new Circulo(posX, posY));
			posX = 100.0;
			posY = 100.0;
			desenha = true;
			repaint();
		}	
	}
	 
	public static void main(String args[])
	{
		Tela obj = new Tela();
		obj.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}	
}
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;

public class Circulo
{
	public double width;
	public double heigth;
	public double x;
	public double y;

	public Circulo(double posX, double posY)
	{
		width = 50.0;
		heigth = 50.0;
		x = posX;
		y = posY;
	}

	public void draw(boolean desenha, boolean selecionado, Graphics2D g2)
	{
		Ellipse2D.Double myEllipse = new Ellipse2D.Double(x, y, width, heigth);
		
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);

		if(selecionado){
			g2.setStroke(new BasicStroke(6));
			g2.setPaint(Color.cyan);
			g2.fill(myEllipse);
			g2.setPaint(Color.lightGray);
		}
		else{
			g2.setStroke(new BasicStroke(4));
			g2.setPaint(Color.white);
			g2.fill(myEllipse);
			g2.setPaint(Color.GRAY);
		}
		
		// Somente desenho caso a minha flag "desenha" esteja setada como true
		if(desenha){
			g2.draw(myEllipse);
		}
	}
	
	public boolean verificaMouseDentroDoCirculo(int mousePosX, int mousePosY)
	{
		if(((mousePosX > getPosx()) && (mousePosY > getPosy()))
				&& ((mousePosX < (getWidth() + getPosx())) && (mousePosY <
				(getHeigth() + getPosy())))){
			return true;
		}
		return false;
	}
	
// Métodos get //
//----------------------------------------------------------------------------------------//
	public Double getPosx() {
		return x;
	}

	public Double getPosy() {
		return y;
	}

	public Double getWidth() {
		return width;
	}

	public Double getHeigth() {
		return heigth;
	}
//----------------------------------------------------------------------------------------//
	
// Métodos set //
//----------------------------------------------------------------------------------------//
	public void setPosx(double newPosx) {
		x = newPosx;
	}

	public void setPosy(double newPosy) {
		y = newPosy;
	}

	public void setWidth(double newWidth) {
		width = newWidth;
	}

	public void setHeigth(double newHeigth) {
		heigth = newHeigth;
	}
//----------------------------------------------------------------------------------------//
}

Coloquei um método dentro da classe Circulo para se verificar se eu cliquei dentro da area do circulo…

agora consigo criar mais de uma instancia de Circulo…porém naum consigo acionar os listeners do mouse!
quer dizer…ateh consigo. Consigo identificar se eu cliquei em cima dele, mas naum consigo movê-lo…
alguem sabe o pq!?
estou tratando eles no lugar errado!?
e os listeners estao agindo em cima de todos os objetos circulo que eu desenhar ao mesmo tempo…tem como tratá-los individualmente?!