Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Aprendiz CSS

Cronometro

Recommended Posts

Olá pessoal.

 

Ontem a noite em casa criei um programinha simples que é um cronometro.

 

Estava muito cansado, ai resolvi abrir o netneans e desenhar o layout, peço que não olhem essa parte do código.

 

Eu sei que é bem simples o projeto, mas creio que seja muito útil para aprender alguma coisinha.

 

Gostaria de saber quais tipos de melhorias você fariam no programa e porque? Tipo a questão da performance, etc.!

 

Abaixo seguem os códigos.

 

PrincipalTela.java

import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class PrincipalTela extends JFrame {

	private static final long serialVersionUID = 1L;
	
	private static boolean contador = false;
	private static boolean zerado = false;
    private JButton iniciar;
    private static JLabel lConta;
    private JPanel mainPanel;
    private JButton pausar;
    private JButton zerar;

	public static void main(String[] args) {
		new PrincipalTela().montaTela();
		Contador cont = new Contador(lConta);
		cont.start();
	}
	
	private void montaTela(){
		this.setTitle("Cronometro");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(240, 120);
		
        mainPanel = new javax.swing.JPanel();
        lConta = new javax.swing.JLabel();
        iniciar = new javax.swing.JButton();
        pausar = new javax.swing.JButton();
        zerar = new javax.swing.JButton();

        mainPanel.setName("mainPanel"); // NOI18N

        lConta.setText("00:00:00"); // NOI18N
        lConta.setName("lConta"); // NOI18N

        iniciar.setText(">"); // NOI18N
        iniciar.setName("iniciar"); // NOI18N
        iniciar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                iniciarActionPerformed(evt);
            }
        });

        pausar.setText("ii"); // NOI18N
        pausar.setName("pausar"); // NOI18N
        pausar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pausarActionPerformed(evt);
            }
        });

        zerar.setText("zerar"); // NOI18N
        zerar.setName("zerar"); // NOI18N
        zerar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                zerarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lConta, javax.swing.GroupLayout.DEFAULT_SIZE, 273, Short.MAX_VALUE)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addComponent(iniciar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 40, Short.MAX_VALUE)
                        .addComponent(pausar)
                        .addGap(32, 32, 32)
                        .addComponent(zerar)))
                .addContainerGap())
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lConta)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(iniciar)
                    .addComponent(zerar)
                    .addComponent(pausar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        this.add(mainPanel);
        this.setVisible(true);
	}

    private void iniciarActionPerformed(ActionEvent evt) {
        contador = true;
        iniciar.setEnabled(false);
        pausar.setEnabled(true);
        zerar.setEnabled(false);
    }

    private void pausarActionPerformed(ActionEvent evt) {
    	contador = false;
        iniciar.setEnabled(true);
        pausar.setEnabled(false);
        zerar.setEnabled(true);
    }

    private void zerarActionPerformed(ActionEvent evt) {
    	contador = false;
    	lConta.setText("00:00:00");
    	zerado = true;
    	lConta.revalidate();
        iniciar.setEnabled(true);
        pausar.setEnabled(false);
    }

	
	public static boolean isContador(){
		return contador;
	}

	public static boolean isZerado(){
		return zerado;
	}
	
	public static void setZerado(boolean zero){
		zerado = zero;
	}
	
	
}

Contador.java

import javax.swing.JLabel;

public class Contador extends Thread {

    private JLabel hr;

    public Contador(JLabel hora) {
        this.hr = hora;
    }

    @Override
    public void run() {
       try {
    	   int segundo = 0;
           int hora = 0;
           int minuto = 0;
           while( true ) {
        	   if( PrincipalTela.isContador() ) {
        		   if( PrincipalTela.isZerado() ) {
        			   segundo = 0;
        	           hora = 0;
        	           minuto = 0;
        	           PrincipalTela.setZerado(false);
        		   }
        		   
	               if( segundo == 59 ){
	                   segundo = 00;
	                   minuto = minuto+1;
	               }
	
	               if( minuto == 59 ){
	                   minuto = 00;
	                   hora = hora+1;
	               }
	               segundo++;
	               String timer = completaComZero(hora) + ":" +
	                              completaComZero(minuto) + ":" +
	                              completaComZero(segundo);
	               this.hr.setText(timer);
	               this.hr.revalidate();
        	   }
        	   Thread.sleep(1000);
           }
       } catch (InterruptedException ex) {
           ex.printStackTrace();
       }
    }

    private String completaComZero(Integer i) {
        String retorno = null;
        if( i < 10 ) {
            retorno = "0"+i;
        } else {
            retorno = i.toString();
        }
        return retorno;
    }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na classe PrincipalTela corrigi apenas a identação. Como não é de interesse observar a classe de interface gráfica, pulei. Observe também que no método main eu alterei a forma com que a thread é executada.

 

Na classe contador, removi a herança e implementei a interface Runnable. De concreto, só muda a forma de acesso à thread, porém, tem algumas diferenças conceituais e é a maneira mais indicada de implementar multiprocessamentos. Primeiro porque você define um comportamento da classe utilizando implementação de interface. Com herança, você está transformando a classe Contador em Thread. Utilizando herança, a classe Contador conterá todo o comportamento de uma Thread (métodos e atributos). E é claro que esse não é o objetivo. Queremos apenas executar um método para que seja multiprocessado. Segundo porque você tem a possibilidade de herdar de uma outra classe. Imagine que num determinado projeto, você precise que uma classe que será multiescalonada precise herdar de uma outra classe além de Thread. Como java não permite herança múltipla, você teria um sério problema. Por isso existe a interface Runnable. Para evitar esse tipo de problema.

 

Também foi corrigido um pequeno erro de lógica que fazia com que ao chegar aos 59 segundos, o contador pulasse pra 01:01 ao invés de 01:00.

 

E o mais importante, ao meu ver, o desacoplamento do método run. Eu dividi as diferentes tarefas entre métodos. Dessa maneira, apesar de aumentar o número de linhas da classe, torna o código muito mais legível, compreensível e mais fácil de manter.

 

PrincipalTela.java

import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PrincipalTela extends JFrame {

    // ... mais código acima

    public static void main(String[] args) {
        new PrincipalTela().montaTela();
        Contador cont = new Contador(lConta);
        Thread thread = new Thread(cont);
        thread.start();
    }

    // ... mais código abaixo
}

Contador.java

import javax.swing.JLabel;

public class Contador implements Runnable {

    private JLabel hr;
    private int hora;
    private int minuto;
    private int segundo;

    public Contador(JLabel hora) {
        this.hr = hora;
        this.hora = this.segundo = this.minuto = 0;
    }

    @Override
    public void run() {
       try {
           while(true) {
               this.executa();
           }
       } catch (InterruptedException ex) {
           ex.printStackTrace();
       }
    }
    
    private void executa() throws InterruptedException {
        if(PrincipalTela.isContador()) {
           this.zera();
           this.hr.setText(this.tempoFormatado());
           this.hr.revalidate();
       }
       Thread.sleep(1000);
    }
    
    private void zera() {
        if(PrincipalTela.isZerado()) {
            PrincipalTela.setZerado(false);
            hora = minuto = segundo = 0;
        }
    }

    private String tempoFormatado() {
        this.configuraTempo();
        String h = (hora < 10 ? ("0" + hora) : String.valueOf(hora));
        String m = (minuto < 10 ? ("0" + minuto) : String.valueOf(minuto));
        String s = (segundo < 10 ? ("0" + segundo) : String.valueOf(segundo));
        return String.format("%s:%s:%s", h, m, s);
    }
    
    private void configuraTempo() {
        this.configuraSegundos();
        this.configuraMinutos();
        this.configuraHoras();
    }
    
    private void configuraSegundos() {
        segundo++;
        if(segundo == 60) {
            segundo = 0;
            minuto++;
        }
    }

    private void configuraMinutos() {
        if(minuto == 60) {
            minuto = 0;
            hora++;
        }
    }

    private void configuraHoras() {
        if(hora == 24) {
            hora = 0;
        }
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.