[RESOLVIDO] Pausar Aplicação?

14 respostas
B

Começei a estudar java faz alguns meses, e decidi criar um desafio para mim mesmo e esse desafio foi fazer um jogo da memória. Ele está 99% pronto porém ocorre um pequeno erro de lógica que não consigo arrumar.

O código encontra-se logo abaixo e os comentários dizem a respeito desse erro.A imagem do segundo botão não aparece pela rapidez que a aplicação é rodada, porém não consigo para-la para mostrar essa imagem. Então gostaria de saber se existe algum outro método de pause sem ser o Thread.sleep ?

Mas se for outro erro, gostaria que me ajudassem, pois estou a dias tentando concertar isso, porém sem êxito.

for(int j = 0 ; j<button.length; j++){
			
			
			if (e.getSource() == button[j] && contador == 0){
				
				
					

				    a = button[j].getIndex();							
				    primeiro = j;										
				    button[primeiro].setFaceUp(true);
				    contador++;
					repaint();
					break;				
					
					
			}

			if  (e.getSource() == button[j] && contador == 1){
			b = button[j].getIndex(); 
			segundo = j;
			button[segundo].setFaceUp(true);
			Pause(1);//// ERRO AQUI A IMAGEM DO SEGUNDO CLIQUE NÃO APARECE, TENTEI PAUSAR A APLICAÇÃO MAS MESMO ASSIM ELA NÃO APARECE !
			repaint();
					
			
			
	        if (a == b){
	        	acertou = true;
	        	contador = 0;
	        }
	        if (a != b){
	        	acertou = false;
				contador = 0;
				
	        }
			/// QUANDO RETIRO ESSAS LINHAS, A IMAGEM APARECE.. POR ESSA RAZÃO NÃO É ERRO NO DIRETÓRIO DAS IMAGENS.
			if (acertou == true){
				button[primeiro].setEnabled( false );
				button[segundo].setEnabled( false ); 
				
			}
			
			if (acertou == false){
				button[primeiro].setFaceUp(false);
				button[segundo].setFaceUp(false); 
				
			}

Obrigado

14 Respostas

jeroqueiroz

De uma olhada em outros códigos já feitos e você confere com o seu…

B

jeroqueiroz:
De uma olhada em outros códigos já feitos e você confere com o seu…

http://www.guj.com.br/java/115072-jogo-da-memoria-em-java-codigo-fonte

Obrigado por tentar ajudar, porém não me ajudou muito pois a lógica usada nos outros jogos são muito diferente da que eu usei, ae no caso terei de mudar praticamente tudo :S; Se alguem pudesse me ajudar, eu agradeceria ^^

Vingdel

Bom dia, BrunoRP!

Posta o código do for todo… Gostaria de ver o fechamento do segundo if e do for para sugerir uma mudança.

Abraço!

B
Vingdel:
Bom dia, BrunoRP!

Posta o código do for todo... Gostaria de ver o fechamento do segundo if e do for para sugerir uma mudança.

Abraço!

Opa aqui está:

for(int j = 0 ; j<button.length; j++){
 
			
			
			if (e.getSource() == button[j] && contador == 0){
				
				
					

				    a = button[j].getIndex();							
				    primeiro = j;										
				    button[primeiro].setFaceUp(true);
				    contador++;
				    //System.out.println(primeiro);
					repaint();
					break;
					
					
					
			}
			if  (e.getSource() == button[j] && contador == 1){
			b = button[j].getIndex(); 
			segundo = j;
			button[segundo].setFaceUp(true);
			Pause(1);//// ERRO AQUI A IMAGEM DO SEGUNDO CLIQUE NÃO APARECE '-'
			//System.out.println(segundo);
			repaint();
					
			
			
	        if (a == b){
	        	acertou = true;
	        	contador = 0;
	        	acertos ++;
	        	tentativas++;
	        	jogadas++;
	        	pontuacao +=100;
	        }
	        if (a != b){
	        	acertou = false;
				contador = 0;
				tentativas --;
				jogadas++;
				pontuacao -=50;
	        }
			
			if (acertou == true){
				button[primeiro].setEnabled( false );
				button[segundo].setEnabled( false ); 
				
			}
			
			if (acertou == false){
				button[primeiro].setFaceUp(false);
				button[segundo].setFaceUp(false); 
				
			}


			}

Obrigado :)

Vingdel

Boa noite, BrunoRP!

Além das modificação com o intuito de tentar resolver teu problema, fiz algumas modificações para dar uma enxugada no código. Ahh, estou considerando que seu for só tem esse código, afinal ou ficou faltando parte do código ou faltou apenas as chave de fechamento do for no trecho que você colocou.

Veja se assim fica legal:
for(int j = 0 ; j < button.length; j++){

	if (e.getSource() == button[j] && contador == 0){
		a = button[j].getIndex();
		primeiro = j;
		button[primeiro].setFaceUp(true);
		contador++;
		repaint();
		break;
	}

	if  (e.getSource() == button[j] && contador == 1){
		b = button[j].getIndex(); 
		segundo = j;
		button[segundo].setFaceUp(true);
		contador = 0;		// Comentário A: Acredito que seja melhor aqui, afinal estava nos dois IFs a seguir
		jogadas++;		// Idem ao Comentário A
		repaint();
	}
	if (a == b){
		acertou = true; // Se essa variável não for usada para mais nada, pode apagar
		acertos++;
		tentativas++; // Realmente aumenta o número de tentativas se acertar???
	       	pontuacao += 100;
		button[primeiro].setEnabled(false);
		button[segundo].setEnabled(false);
	}else{
		acertou = false; // Se essa variável não for usada para mais nada, pode apagar
		tentativas--;
		pontuacao -= 50;
		button[primeiro].setFaceUp(false);
		button[segundo].setFaceUp(false);
	}
}

Abraço!

B

Boa Noite !

Muito Obrigado Vingdel ^^… Entendi perfeitamente seu código, álias eu havia tentado fazer isso antes… Só que há um erro quando clico em qualquer um dos botões no caso:

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

at CenarioI.actionPerformed<a>b</a>[/b]

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$000(Unknown Source)

at java.awt.EventQueue$1.run(Unknown Source)

at java.awt.EventQueue$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)

at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue$2.run(Unknown Source)

at java.awt.EventQueue$2.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

A linha 314 refere-se a á : button[primeiro].setEnabled(false);

Desculpe o encomodo :?

Vingdel

Bruno, esse erro foi gerado pela alteração que fiz?

Incômodo nenhum…

B

Sim, e é isto que está a me incomodar, pois a principio fiz o código como o que você postou e depois fiz este que postei. Estive pensando aqui e percebo que o erro encontra-se nesse if :

if (acertou == false){
				button[primeiro].setFaceUp(false);
				button[segundo].setFaceUp(false); 
				
			}

pois quando o retiro, a imagem do segundo botão clicado aparece sem problemas.

Outro possivel erro:

Esse if, eu só fecho no fim da aplicação, pois quando fecho pós o repaint();, o restante do código não roda.. logo quado clico nos botões nada se altera, e ao meu ver ele teria de ser fechado após o repaint, como você colocou em seu código;

if  (e.getSource() == button[j] && contador == 1){
			b = button[j].getIndex(); 
			segundo = j;
			button[segundo].setFaceUp(true);
			repaint();

Estou abismado com isso, pq este é um projeto que estou fazendo para aumentar meu raciocio lógico e a minha manipulação com interface gráfica, pois começei com java a pouco tempo e o engraçado que o jogo está perfeito só da esse "maldito" erro rsrs.

E novamente muito obrigado Vingdel ^^

Vingdel

Você se importaria de disponibilizar o projeto pra eu dar uma olhada?

B

Claro ! Por e-mail ou aqui mesmo ? ^^

Vingdel

Pode ser por e-mail: [endereço removido pelo autor]

B

Enviado !

Obrigado :slight_smile:

Vingdel

Boa Tarde, BrunoRP!

Bom, meu camarada, como combinado voltei para trazer uma sugestão para resolver o teu "problema".

Para resumir vou colar aqui a sugestão de como pode ficar teu for, segue trecho:
for(int j = 0 ; j < button.length; j++){	        
			if (e.getSource() == button[j] && contador == 0){  
				a = button[j].getIndex();
				primeiro = j;
				button[primeiro].setFaceUp(true);  
				contador++;  
				repaint();
				break;  
			}
	      
			if  (e.getSource() == button[j] && contador == 1){
				b = button[j].getIndex();   
				segundo = j;
				button[segundo].setFaceUp(true);
				contador = 0;
				jogadas++;

				if (a == b){
					acertos++;  
					tentativas++;
					pontuacao += 100;
					button[primeiro].setEnabled(false);  
					button[segundo].setEnabled(false);  
				}else{
					t = new Timer();
					t.schedule(new Up(), 1000);
				}
			}
		}
Além dessa modificação no for, você deve criar a seguinte classe interna:
private class Up extends TimerTask {
		public void run() {
			tentativas--;
			pontuacao -= 50;
			button[primeiro].setFaceUp(false);  
			button[segundo].setFaceUp(false);
			t.cancel();
		}
	}
Basta colocá-la após o fechamento do método actionPerformed(ActionEvent e), um exemplo fica assim:
public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
		// onde estão as ações dos botões

	}
	private class Up extends TimerTask {
		public void run() {
			tentativas--;
			pontuacao -= 50;
			button[primeiro].setFaceUp(false);  
			button[segundo].setFaceUp(false);
			t.cancel();
		}
	}
Bruno, vi que teu código tem muita coisa redundante e notei que há alguns endereços de imagens errados, acredito que algumas imagens não estejam aparecendo corretamente quando você roda o jogo aí na tua máquina, ou pode ser que não rode na máquina de outras pessoas, pois aqui tive que corrigir praticamente todas. Um exemplo de redundância do teu código:
if(e.getSource() == voltar){
			CenarioI.this.dispose();
			pause(1);
			Selecao frm = new Selecao();
			frm.setSize(1024,720);	// <--- Faça isto dentro da classe Selecao
			frm.setVisible(true);
			frm.setDefaultCloseOperation(frm.EXIT_ON_CLOSE);	// <--- Faça isto dentro da classe Selecao
			frm.setLocationRelativeTo(null);	// <--- Faça isto dentro da classe Selecao
		}
Veja a parte que comentei do código, essas configurações devem ser feitas dentro da classe, assim você não precisa ficar definindo a cada vez que você instanciá-la, o setVisible(), sim, deve ser feito ao instanciar a classe. Estudando seu código para entender seu raciocínio vi você fazendo isso em vários lugares que poderiam ser evitados com essa sugestão. Sem querer ser chato, outro detalhe que notei foi quanto ao método Pause() da classe CenarioI, que está assim:
public void Pause(int seconds) {
		try {
			Thread.sleep(500*seconds);
		} catch (Exception e) {
		}
	}
Se você quer entrar com o argumento para ele em segundos, você deveria fazer a multiplicação por 1000 e não por 500, além disso convém você nomeá-lo como "pause" (primeira letra minúscula). Notei também que você tem uma classe chamada Botão, sugiro que você retire o "~" deixando apenas "Botao" para evitar problemas, o mesmo vale para diretórios e arquivos usados no projeto.

Fico por aqui, espero que eu tenha ajudado e me desculpe pela demora, mas as coisas estão um pouco corridas e só tive realmente tempo de olhar teu projeto ontem de noite e hoje.

Gostaria de saber se alguém tem opiniões diferentes da minha para expor, principalmente quanto ao uso do Timer.

Abraço!

B

Nossa, muito obrigado por tudo ! Consegui fazer o jogo rodar perfeitamente e só tenho a agrade-lo com isso.

Abraço ! :smiley:

Criado 5 de fevereiro de 2012
Ultima resposta 11 de fev. de 2012
Respostas 14
Participantes 3