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

Captando a hora do sistema no modelo hh:mm:ss

Vini, uma dúvida, tem como implementar este relógio através do padrão Observer em vez de Threads?

seja a classe visão MyFrame sendo um Observer e a classe modelo ClockRunnable sendo um Observable onde toda vez que houvesse uma atualização no modelo fosse exibida na visão.

ou por ser uma atualização constante não seria uma boa implementação com Observer/Observable?

[quote=Carvier]O mesmo ocorre com o último código de “ViniGodoy”.
e então galera?
Saudações.[/quote]

Deve ser problema de busy waiting.

Tente com o serviço de agendamento de threads “novo” (Java 5).

http://www.java2s.com/Code/Java/Threads/Java1550newfeatureThreadSchedule.htm

[quote=ViniGodoy]Nilson,

Existe sim, mas não é um componente. É uma classe. Na verdade existem duas.

Dê uma pesquisada nas classes java.util.Timer e java.swing.Timer. Normalmente eu uso a primeira, ou gerencio através de Threads mesmo.[/quote]

Olá Vini, tudo bem?

Vou ressuscitar esta thread pra tirar uma dúvida sobre Threads contigo(rsrsrs). Queria saber por que sua preferência era/é normalmente usar o java.util.Timer ao invés de java.swing.Timer. E queria saber também se o java.swing.Timer pode sofrer alguma interferência da thread do AWT e vise-versa. Porque eu encontrei uma situação que o java.swing.Timer ficou travado como se ele não tivesse iniciado…

aproveito para divulgar meu projeto despertador java, que é relacionado com esta questão de horas, inclusive com soma de horas, etc…

tem uma versão ±nova no site http://www.raghy.net23.net e outros interessantes projetos também… busque em página java. O Inicial é em flash.

segue o tópico do despertador, lá se procurar vc consegue achar o código em txt.
http://www.guj.com.br/java/262263-despertador-em-java

recentemente pus uma versão (no tópico guj e no site) que fiz de despertador criada em flash, foge ao foco java, mas é o mesmo assunto (e programacional )
e ficou bastante interessante. vale conferir.

[quote=tiagosarno]Pessoal,
sou bem iniciante na linguagem ainda e gostaria como posso fazer para criar um método que mostra a hora do sistema dinâmicamente como em java-script onde os segundos vão passando: tipo 22:45:36

Alguém tem este método ou sabe como fazer? Desde já agradeço …

Tiago [ HcK ]
[/quote]

Tiago,
Vejo que já é usuário no GUJ desde 2007
e por isso não se entendi bem sua dúvida dizendo
que é iniciante na linguagem e não sei se o que vou postar
vai te ajudar. De qualquer maneira vou tentar.

Olhe as informações abaixo:

Oi amigo encontrei esse vídeo no youtube que acho que atende
para colocar em qualquer lugar também, inclusive em jframes, jpanels, jlabels e etc.

http://www.youtube.com/watch?v=8PWzqJFhCaQ

Testei aqui e rodou direitinho.

Segue o código que digitei pegando no youtube:

Fiz no NetBeans para ir mais rápido.

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Frame extends javax.swing.JFrame {

    /**
     * Creates new form Frame
     */
    public Frame() {
        initComponents();
        new Thread(){
            @Override
            public void run(){
                for(;;){
                    dataEHora();
                    
                    try{
                        sleep(1000);
                    }catch(InterruptedException ie){
                        ie.printStackTrace();
                    }
                }
            }
        }.start();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        lData = new javax.swing.JLabel();
        lHora = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        lData.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        lData.setForeground(new java.awt.Color(51, 51, 255));
        lData.setText("jLabel1");

        lHora.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        lHora.setForeground(new java.awt.Color(51, 51, 255));
        lHora.setText("jLabel2");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lData)
                .addGap(18, 18, 18)
                .addComponent(lHora)
                .addContainerGap(220, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lData)
                    .addComponent(lHora))
                .addContainerGap(260, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    
    public void dataEHora(){
        Calendar cal = new GregorianCalendar();
        int dia = cal.get(Calendar.DAY_OF_MONTH);
        int mes = cal.get(Calendar.MONTH);
        int ano = cal.get(Calendar.YEAR);
        
        int hora = cal.get(Calendar.HOUR);
        int minuto = cal.get(Calendar.MINUTE);
        int segundo = cal.get(Calendar.SECOND);
        
        lData.setText("Data:"+dia+"/"+(mes+1)+"/"+ano);
        lHora.setText("Hora:"+hora+":"+minuto+":"+segundo);
        
    }
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Frame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JLabel lData;
    private javax.swing.JLabel lHora;
    // End of variables declaration
}

Abraço.

[quote=ViniGodoy]Finalmente, um outro exemplo usando o timer do Swing.

Note que agora nem mesmo o EventQueue.invokeLater é necessário, uma vez que esse timer gera ações na Thread certa. Creio que para o seu caso, seja o mais fácil de se implementar.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class MyFrame extends JFrame {
    // Local onde atualizaremos a hora
    private JLabel lblHora;

    // Formatador da hora
    private static final DateFormat FORMATO = new SimpleDateFormat("HH:mm:ss");

    public MyFrame() {
        // Construímos nosso frame
        super("Exemplo");
        setLayout(new FlowLayout());
        getContentPane().add(getLblHora());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200, 75);
        setVisible(true);

        // Iniciamos um timer para atualizar o relógio
        Timer t = new Timer(1000, new ClockAction());               
        t.setInitialDelay(0);
        t.setRepeats(true);
        t.start();
    }

    private JLabel getLblHora() {
        if (lblHora == null) {
            lblHora = new JLabel();
        }
        return lblHora;
    }

    /**
     * Método para atualizar a hora no formulário. Não é thread-safe, portanto,
     * se o utilizado fora da thread da AWT, deve-se utilizar um dos comandos da
     * EventQueue (invokeLater ou invokeAndWait).
     */
    public void setHora(Date date) {
        getLblHora().setText(FORMATO.format(date));
    }

    /**
     * Action que contém o código que atuará na nossa thread. Basicamente, ele
     * chama o método setHora de segundo em segundo, passando a data atual.
     * Roda diretamente na thread da AWT. 
     */
    private class ClockAction implements ActionListener {

        public void actionPerformed(ActionEvent e)
        {
            // Só podemos chamar setHora diretamente dessa
            // forma, pois esse Runnable é uma InnerClass não
            // estática.
            setHora(new Date());
        }
    }

    public static void main(String args[]) {
        new MyFrame();
    }
}
[/code][/quote]





Então viny  então estou tentando pegar esse codigo e transformar em uma classe que eu possa usar em outros lugares com o intuito de ao clicar em um botão de um formulário ele comece a contar o tempo e ao terminar de executar uma ação ele pare o tempo e imprima quantos minutos levou para aquela ação. 

Meu código ta ficando assim 

[code]public class Cronometro  {
    // Local onde atualizaremos a hora  
    private JLabel lblHora;  
  
    // Formatador da hora  
    private static final DateFormat FORMATO = new SimpleDateFormat("HH:mm:ss");  
  
    public Cronometro() {  
        // Construímos nosso frame  
  
  
        // Iniciamos um timer para atualizar o relógio  
        Timer t = new Timer(1000, new ClockAction());                 
        t.setInitialDelay(0);  
        t.setRepeats(true);  
        t.start();  
    }  
  
    private JLabel getLblHora() {  
        if (lblHora == null) {  
            lblHora = new JLabel();  
        }  
        return lblHora;  
    }  
  
    /** 
     * Método para atualizar a hora no formulário. Não é thread-safe, portanto, 
     * se o utilizado fora da thread da AWT, deve-se utilizar um dos comandos da 
     * EventQueue (invokeLater ou invokeAndWait). 
     */  
    public void setHora(Date date) {  
        getLblHora().setText(FORMATO.format(date));  
    }  
  
    /** 
     * Action que contém o código que atuará na nossa thread. Basicamente, ele 
     * chama o método setHora de segundo em segundo, passando a data atual. 
     * Roda diretamente na thread da AWT.  
     */  
    private class ClockAction implements ActionListener {  
  
        public void actionPerformed(ActionEvent e)  
        {  
            // Só podemos chamar setHora diretamente dessa  
            // forma, pois esse Runnable é uma InnerClass não  
            // estática.  
            setHora(new Date());  
        }  
    }  
  
   

}

Você saberia me dizer como faço para imprimir em uma string esse tempo?