GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Data e hora em tempo real


#1

gente, eu coloquei esse código em um programa, pra mostrar a data e a hora, maaas eu preciso que a hora fique mudando, tipo, não sej a hora de quando eu abri a janela mas sim a hora real entendem? que fique atualizando..

// data e hora
		Locale locale = new Locale("pt","BR");
		GregorianCalendar calendar = new GregorianCalendar();
		SimpleDateFormat formatador = new SimpleDateFormat("dd'/'MM'/'yyyy' - 'HH':'mm':'ss",locale);
		dataagora = botao.crialabel(220, 15, 165, 30, this, panel);
		dataagora.setEditable(false);
		dataagora.setText(formatador.format(calendar.getTime()));
		dataagora.setForeground(Color.blue);

valeu


#2

Tem que usar AJAX, se quiser chamar o servidor ou fazer em JavaScript pegando a data e hora da máquina do cliente.
Particularmente, AJAX é mais seguro, evita de ter a data e hora diferentes do servidor.


#3

Ele está usando Desktop, não web.

Pode usar o java.util.Timer para ficar executando um código de tempos em tempos. Para obter a data e hora atual, só use um new Date().


#4

E como eu faço isso exatamente?
valeu pela ajuda


#5

package relogio;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Relogio {
    public static void main(String[] args) {
        new Relogio().start();
    }
    public void start() {
        final SimpleDateFormat HHmmss = new SimpleDateFormat("HH:mm:ss");
        // crie um TimerTask estendendo dele ou sobreescrevendo ele na hora
        TimerTask task = new TimerTask() {
            // sobreescreva o método run
            @Override
            public void run() {
                // aqui vai o código a ser executado
                // no lugar do sop pode vir um jpanel.setText(), ou de qqr
                // outro componente de java desktop
                // não se esqueça que os objetos de fora usados aqui devem
                // ser final
                System.out.println(HHmmss.format(new Date()));
            }
        };
        // use este método para rodar o código acima repetidamente
        // leia o javadoc do Timer se quiser saber o que isto significa
        new Timer().scheduleAtFixedRate(task, 0, 1000);
        try {
            // paro a thread principal aqui para o programa não terminar
            // isto é só para este programa de demonstração, não faça isso!
            wait();
        }
        catch (Exception ex)
        {}
    }
}

#6

ae bruno tentei colocar u jTextField.setText() ao invez de um system.out.printl porem mesmo colocando como final não funcionou, tem como me dar um força?

obrigado


#7

Exemplo de TimerTask, funciona da mesma forma que um Runnable.

   class Relogio extends TimerTask
   {
      JTextField textField;
      SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
      public Relogio(JTextField textField)
      {
         this.textField = textField;
      }
      public void run()
      {
         textField.setText(sdf.format(new Date()));
      }
   }

No teu código você passa o JTextField a ser atualizado para o Relogio

      Timer t = new Timer();
      t.scheduleAtFixedRate(new Relogio(textField), 0, 1000);

#8

Pow Bruno Laturner,
Primeira vez que participo do fórum!
Mas é pra agradecer...
Seu esclarecimento pra mim foi muito bacana... Vlw...

GUJ é show....!


#9

[quote=Bruno Laturner]Exemplo de TimerTask, funciona da mesma forma que um Runnable.

   class Relogio extends TimerTask
   {
      JTextField textField;
      SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
      public Relogio(JTextField textField)
      {
         this.textField = textField;
      }
      public void run()
      {
         textField.setText(sdf.format(new Date()));
      }
   }

No teu código você passa o JTextField a ser atualizado para o Relogio

      Timer t = new Timer();
      t.scheduleAtFixedRate(new Relogio(textField), 0, 1000);

[/quote]

Ai amigo este jeito que vc fez ele esta sempre escrevendo, no console e não apaga... só por curiosidade e tentei limpar o console sempre antes de ele escrever o próximo mais esta gerando um erro. Eu usei a classe Runtime para apagar o console.

assim:

public static void main(String[] args){  
        new Relogio().start();  
    }  
    public void start(){  
        final SimpleDateFormat HHmmss = new SimpleDateFormat("HH:mm:ss");  
        // crie um TimerTask estendendo dele ou sobreescrevendo ele na hora  
        TimerTask task = new TimerTask() {  
            // sobreescreva o método run  
            @Override  
            public void run()  {  
                // aqui vai o código a ser executado  
                // no lugar do sop pode vir um jpanel.setText(), ou de qqr  
                // outro componente de java desktop  
                // não se esqueça que os objetos de fora usados aqui devem  
                // ser final
            	try {
            		Runtime.getRuntime().exec("cls");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}           	
                System.out.println(HHmmss.format(new Date())); 
            }  
        };  
        // use este método para rodar o código acima repetidamente  
        // leia o javadoc do Timer se quiser saber o que isto significa  
        new Timer().scheduleAtFixedRate(task, 0, 1000);  
        try {  
            // paro a thread principal aqui para o programa não terminar  
            // isto é só para este programa de demonstração, não faça isso!  
            wait();  
        }  
        catch (Exception ex)  
        {}  
    }

Ai estourou esta exceção:

java.io.IOException: Cannot run program "cls": CreateProcess error=2, O sistema não pode encontrar o arquivo especificado
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
	at java.lang.Runtime.exec(Runtime.java:593)
	at java.lang.Runtime.exec(Runtime.java:431)
	at java.lang.Runtime.exec(Runtime.java:328)
	at br.com.michel.Relogio$1.run(Relogio.java:35)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)
Caused by: java.io.IOException: CreateProcess error=2, O sistema não pode encontrar o arquivo especificado
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
	at java.lang.ProcessImpl.start(ProcessImpl.java:30)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
	... 6 more

Desde já agradeço.


#10

O console de saída não é o que você está pensando:

Quando o programa Java é executado, o ambiente que o executa passa quais serão as formas de entrada e saída de dados associadas aos objetos System.in, System.err e System.out.

System.out é um objeto do tipo PrintStream, ou seja, onde Stream significa uma correnteza de dados em uma mão só, ou você somente manda dados ou somente os recebe. No momento que algo imprimido no System.out, a stream vai somente para a frente. Por isso que não é possível voltar e imprimir algo no mesmo lugar, esta função pertence à ao sistema de janelas usado recebe o resultado do System.out.

Quando o programa é executado pelo Eclipse, Netbeans, qqr IDE, este System.out é associado à janela de console de saída da IDE.

Quando o programa é executado por um Prompt de Comandos, seja o cmd.exe do Windows, ou um Terminal em sistemas Unix-like, o System.out também é associado às suas janelas.

No caso, CLS é um comando DOS que limpa a tela e esse comando existe somente no cmd.exe. Este comando não manipula o System.out, ele somente manipula a janela associada a ele (normalmente ele somente pula 20-25 linhas, o tamanho da tela).

Caso queria imprimir algo sempre no mesmo local da janela(num Prompt/Terminal e não os consoles das IDEs), ou seja, manipular o cursor da janela, você precisa de uma biblioteca de interface de usuário baseada em texto. Em Linux a mais famosa é o NCurses, só que ela é nativa ao sistema. Se quiser algo parecido em Java, existe o Java Curses, e outro que faz tempo que não é atualizado chamado CHARVA.

Edit: Desde o Java 6 também existe uma classe Console, que acessa o console associado a VM.


#11

Bruno, muito obrigado meu amigo, ajudou muito, troquei apenas para o componente Jlabel.
Funcionou 100%.
Deus te abençoe.


#12