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!