Dúvidas sobre o meu código

4 respostas
Thallysson

Olá, eu criei uma classe com o seguinte objetivo: fazer com que jlabels fossem criadas em uma quantidade aleatória (no máximo cinco) cada uma de uma lado aleatório da jframe, e na posição y aleatória de acordo com a altura da jframe, e então gostaria que elas fossem se movendo até o lado oposto, e cada vez que uma delas chegasse ao outro lado e não fosse mais vista pelo usuário a mesma fosse destruída, como eu sou um iniciante, eu gostaria que vocês aqui do fórum analisassem meu código, e me falassem erros que vocês viram nele, e se está tudo funcionando como devia, obs: Era para que cada pássaro tenha sua velocidade fixa, mais não está funcionando desse jeito, e alguns pássaros andam juntos como se fossem clones. Meu código é esse:
`

package Objects;

import java.awt.Component;
import java.awt.Image;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class Passaro extends JFrame{
 Random rdm = new Random();
 boolean bo;
 int passquant;
 public void remover(Component c){
 this.remove(c);
 }

Passaro(){
 setTitle("Título");
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setLocationRelativeTo(null);
 setExtendedState(JFrame.MAXIMIZED_BOTH);
 setLayout(null);
 
 int width = this.getWidth();

 passquant = rdm.nextInt(5);
 while(true){
 for(int i = 0; i<=passquant; ++i){
  bo = rdm.nextBoolean();
   if(bo==true){ 
 ImageIcon img = new ImageIcon(getClass().getResource("/Assets/pássaro-i.gif"));
 img.setImage(img.getImage().getScaledInstance(img.getIconWidth()-500,img.getIconHeight()-400, Image.SCALE_DEFAULT));
 int largura = img.getIconWidth();
 int altura = img.getIconHeight();
 JLabel p = new JLabel(img);
 p.setBounds(0,rdm.nextInt(this.getHeight()),largura,altura);
 this.add(p);
 this.repaint();
 new Thread(new Runnable(){
	 public void run(){
		int speed = rdm.nextInt(4)+2;
		while(true){
		 if(p.getX()!=width){
		  p.setBounds(p.getX()+speed,p.getY(),largura,altura);
		 }else if(p.getX()==width){
            remover(p);
		 }
		  try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		}
	 }
   }).start();
  }else if(bo==false){
   ImageIcon img = new ImageIcon(getClass().getResource("/Assets/pássaro.gif"));
   img.setImage(img.getImage().getScaledInstance(img.getIconWidth()-500,img.getIconHeight()-400, Image.SCALE_DEFAULT));
   int largura = img.getIconWidth();
   int altura = img.getIconHeight();
   JLabel p = new JLabel(img);
   p.setBounds(this.getWidth()-100,rdm.nextInt(this.getHeight()),largura,altura);
   this.add(p);
   this.repaint();
     new Thread(new Runnable(){
    	 public void run(){
    	   int speed = rdm.nextInt(4)+2;
    		while(true){
       		 if(p.getX()!=width){
    		  p.setBounds(p.getX()-speed,p.getY(),largura,altura);
       		 }else if(p.getX()==width){
       			 
       		 }
       		 try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    		}
    	 }
     }).start();
}
 passquant = rdm.nextInt(5);
}
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[]args){
 Passaro pass = new Passaro();

}
}

`

4 Respostas

D

Tem alguns problemas.
Tem muita repetição de código, poderia ser simplificado:
(Tente entender antes de fazer substituições)

// Neste momento, decidir a direção e o canto inicial
int direcao;
int xInicial;
if (bo == true) {
    direcao = 1; // move para a direita
    xInicial = 0; // canto esquerdo
} else {
    direcao = -1; // move para a esquerda
    xInicial = this.getWidth()-100; // canto direito
}

/* ... */

// Coloca o passaro na posição inicial
p.setBounds(xInicial, rdm.nextInt(this.getHeight()),largura,altura);

/* ... */

// Aqui, perceba que se a direcao for -1, o speed será um valor
// negativo e moverá o pássaro para a esquerda
int speed = rdm.nextInt(4)+2;
speed = direcao * speed;

/* ... */

// Atualiza a posição
p.setBounds(p.getX() + speed,p.getY(),largura,altura);

Outra problema é que não é 100% garantido que o passaro “p” estará na posição “width” para ser removido, então o correto seria:

// se fora do canto direito ou fora do canto esquerdo
if (p.getX() > width || p.getX() < -largura) {
    // remove p
    remover(p);
    // IMPORTANTE, isto é para terminar a thread, pois "p" foi removido
    return;
} else {
    // Atualiza posição
}
Thallysson

Eu entendi tudo que você me mostrou, e elaborei o seguinte código:

`

package Objects;

import java.awt.Component;
import java.awt.Image;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class Passaro extends JFrame{
 Random rdm = new Random();
 boolean bo;
 int passquant;
 public void remover(Component c){
  this.remove(c);
 }

Passaro(){
 setTitle("Título");
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setLocationRelativeTo(null);
 setExtendedState(JFrame.MAXIMIZED_BOTH);
 setLayout(null);
 
 int width = this.getWidth();

 passquant = rdm.nextInt(5);
 while(true){
  for(int i = 0; i<=passquant; ++i){
   bo = rdm.nextBoolean();
   int direcao;
   int xInicial;
   if(bo==true){ 
 direcao = 1;
 xInicial = 0; 
   }else{
   direcao = -1;
   xInicial = this.getWidth()-100;
    }

   ImageIcon img = new ImageIcon(getClass().getResource("/Assets/pássaro.gif"));
   img.setImage(img.getImage().getScaledInstance(img.getIconWidth()-500,img.getIconHeight()-400, Image.SCALE_DEFAULT));
   int largura = img.getIconWidth();
   int altura = img.getIconHeight();
   JLabel p = new JLabel(img);
   p.setBounds(xInicial,rdm.nextInt(this.getHeight()),largura,altura);
   this.add(p);
   this.repaint();
     new Thread(new Runnable(){
	 public void run(){
	   int speed = rdm.nextInt(4)+2;
	   speed = direcao * speed;
		while(true){
   		 if(p.getX() > width || p.getX() < -largura){
   			remover(p);
   			return;
   		 }else{
   		    p.setBounds(p.getX()+speed,p.getY(),largura,altura);
   		 }
       		 try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    		}
	     }
     }).start();

 passquant = rdm.nextInt(5);
}
  try {
	Thread.sleep(7000);
} catch (InterruptedException e) {
	e.printStackTrace();
    }
    }
  }
 public static void main(String[]args){
 Passaro pass = new Passaro();

 }
}

`
Eu adorei o resultado, muito obrigado por me mostrar esses erros, aprendi muito com isso, porém, eu tenho duas imagens uma do pássaro andando para um lado e outra para o outro, e agora os pássaros dos dois lados possuem o mesmo ícone, você sabe o que eu fiz de errado?

D
String imagem;
if(bo==true){ 
  direcao = 1;
  xInicial = 0;
  imagem = "/Assets/pássaro-i.gif"; // imagem do passaro voltado para direita
}else{
  direcao = -1;
  xInicial = this.getWidth()-100;
  imagem = "/Assets/pássaro.gif"; // imagem do passaro voltado para esquerda
}
ImageIcon img = new ImageIcon(getClass().getResource(imagem));
Thallysson

OK, muito obrigado :slightly_smiling:

Criado 12 de março de 2016
Ultima resposta 14 de mar. de 2016
Respostas 4
Participantes 2