Relogio em java

4 respostas
cu_ringa

Fiz o codigo abaixo e tá quase tudo beleza, se não fosse pelo detalhe de que quando o metodo repaint() é chamado, ele não limpa o fundo, ou seja escreve a hora uma por cima da outra. Alguém sabe como procedo para resolver esse problema?

import java.util.*;
import javax.swing.*;
import java.awt.*;

public class Relogio extends JApplet implements Runnable{
			
	public void init(){
				
		new Thread(this).start();
	}	
			
	public void paint(Graphics g){
		
		g.setFont(new Font("TimesNewRoman", Font.BOLD, 30));
		g.drawString(new Date().toLocaleString(), 10, 40);		
	}
	
	public void run(){
						
		while(true){
			
			try{				
				repaint();
				Thread.sleep(1000);
				System.out.println("1");
			}
			catch(InterruptedException ie){}	
		}		
	}	
	
}

4 Respostas

dudaskank

Você precisa, antes de escrever a hora, limpar a área que está desenhada a string.

Se não me engano, um super(g); no paint() dá o resultado esperado, mas se não for esse o caso, então dá um g.clearRect() passando a área que você deseja limpar.

:slight_smile:

cu_ringa

Fiz do jeito q vc falou, mas o problema agora é q tem vez que a mudança de uma hora para outra faz com q a hora fique como se estivesse piscando, não é aquela coisa contínua, suave. Como posso solucionar esse problema?

import java.util.*;
import javax.swing.*;
import java.awt.*;

public class Relogio extends JApplet implements Runnable{
			
	public void init(){
				
		new Thread(this).start();
	}	
			
	public void paint(Graphics g){
		
		g.clearRect(10, 5, 380, 70);
		g.setFont(new Font("Arial", Font.BOLD, 30));
		g.drawString(new Date().toLocaleString(), 10, 40);				
	}
	
	public void run(){
						
		while(true){
			
			try{
				Thread.sleep(1000);				
				repaint();								
			}
			catch(InterruptedException ie){}	
		}		
	}	
	
}
dudaskank

Isto que pisca é comumente chamado de flickering, que é quando a tela pisca mesmo, só que com nome bonitinho.

Você pode eliminar isto usando uma técnica simples de double buffer, que consiste em desenhar a imagem antes em um buffer fora da tela e depois desenhar este buffer inteiro na janela da sua applet.

Para isso, você pode usar um Image:

// declare como atributo da classe
BufferedImage buffer;

//no método de inicialização, você cria a imagem
buffer = new BufferedImage(tamanhoX, tamanhoY);

// no paint
...
Graphics gBuffer = buffer.getGraphics();
// limpa e escreve o texto no *** gBuffer ***
...
// libera o gBuffer
gBuffer.dispose();
// desenha na applet
g.drawImage(buffer, 0, 0, null);

Novamente, este código não foi testado, mas provavelmente vai funcionar…

A partir do Java 1.4, os componentes Swing (não sei dos Awt) já vem com um método chamado createBufferStrategies(), que pode ser usado para se conseguir double buffering ou page flipping facilmente.

Page flipping é quando você desenha fora da tela, como no double buffering, mas ao invés de copiar o que está fora da tela para ela, a placa de vídeo simplesmente passa a mostrar o conteúdo daquela região da memória. O “ponteiro” que representa o endereço inicial da tela é alterado. Mas isto só em tela cheia, coisa que applets não são…

Entretanto, para se usar estes métodos novos, eu não tenho certeza, mas acho que não é usado no método paint(), e sim nesse caso no run() (ou outro método que você crie para desenhar)… mas isto não estou certo… teria que fazer o teste mesmo.

Falou :slight_smile:

dsiviotti

O JDK vem com um exemplo de relógio.
Veja em [JAVA_HOME]\demo\applets\Clock.

Criado 14 de abril de 2004
Ultima resposta 15 de abr. de 2004
Respostas 4
Participantes 3