Cronometro

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

[code]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;
}

}
[/code]

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 ) {
        	   Thread.sleep(1000);
        	   if( PrincipalTela.isContador() ) {
        		   if( PrincipalTela.isZerado() ) {
        			   segundo = 0;
        	           hora = 0;
        	           minuto = 0;
        	           PrincipalTela.setZerado(false);
        		   }
        		   segundo++;
        		   
	               if( segundo > 59 ){
	                   segundo = 00;
	                   minuto = minuto+1;
	               }
	
	               if( minuto == 59 ){
	                   minuto = 00;
	                   hora = hora+1;
	               }
	               
	               String timer = completaComZero(hora) + ":" +
	                              completaComZero(minuto) + ":" +
	                              completaComZero(segundo);
	               this.hr.setText(timer);
	               this.hr.revalidate();
        	   }
           }
       } 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;
    }

}

[quote=paulofernandesjr]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

[code]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;
}

}
[/code]

Contador.java

[code]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;
}

}
[/code][/quote]

Olá paulofernandesjr, amei seu código!!! só q qria t pedir um favor:

qria fazer a junção do código do cronometro, diret com os componentes gráficos do NetBeans 6.1, e criar um .jar dele… pq vou utilizar esse código como teste, e depois implementa-lo em outro lugar…

tem como fazer esse junção, e criar este .jar?

bjosssss e mto Obrigada desde jah!!!

isso é totalmente possível de ser feito

pode fazer isso sim, apenas mantenha os créditos

[quote=paulofernandesjr]isso é totalmente possível de ser feito

pode fazer isso sim, apenas mantenha os créditos[/quote]

éh q vc sabe como é iniciante!!! to desde de segunda tentando fazer isso e ñ consigo!!!

ñ tem como vc me ajudar!!!

bjosss e obrigada!!!

paulo muito interessante seu codigo, sou iniciante tb em java vou dar uma estudada depois posto alguma coisa assim, e otima ideia nunca vi ng ter a ideia de montar um cronomero :-o .

Parabens.

[quote=Suellen_Susu][quote=paulofernandesjr]isso é totalmente possível de ser feito

pode fazer isso sim, apenas mantenha os créditos[/quote]

éh q vc sabe como é iniciante!!! to desde de segunda tentando fazer isso e ñ consigo!!!

ñ tem como vc me ajudar!!!

bjosss e obrigada!!![/quote]

Qual a sua real dúvida?

bRadoCk, valeu :slight_smile:

[quote=Suellen_Susu][quote=paulofernandesjr]isso é totalmente possível de ser feito

pode fazer isso sim, apenas mantenha os créditos[/quote]

éh q vc sabe como é iniciante!!! to desde de segunda tentando fazer isso e ñ consigo!!!

ñ tem como vc me ajudar!!!

bjosss e obrigada!!![/quote]

Que tal já que você tem o codigo dele como base você não tentar mais em vez de pedir ele pra ele te passar a codificação pronta, apresente duvidas e se quiser eu tiro, pois se você não fazer esse codigo você não vai aprender o funcionamento dele e se necessitar de manutenção?

[quote=paulofernandesjr][quote=Suellen_Susu][quote=paulofernandesjr]isso é totalmente possível de ser feito

pode fazer isso sim, apenas mantenha os créditos[/quote]

éh q vc sabe como é iniciante!!! to desde de segunda tentando fazer isso e ñ consigo!!!

ñ tem como vc me ajudar!!!

bjosss e obrigada!!![/quote]

Qual a sua real dúvida?

bRadoCk, valeu :)[/quote]

Eu ñ consegui relacionar (no caso, unir) os dois códigos (Contador e PrincipalTela) em um único jFrame, para transformá-lo em .jar…

isso q ñ consigo fazer…

[quote=guialeixo][quote=Suellen_Susu][quote=paulofernandesjr]isso é totalmente possível de ser feito

pode fazer isso sim, apenas mantenha os créditos[/quote]

éh q vc sabe como é iniciante!!! to desde de segunda tentando fazer isso e ñ consigo!!!

ñ tem como vc me ajudar!!!

bjosss e obrigada!!![/quote]

Que tal já que você tem o codigo dele como base você não tentar mais em vez de pedir ele pra ele te passar a codificação pronta, apresente duvidas e se quiser eu tiro, pois se você não fazer esse codigo você não vai aprender o funcionamento dele e se necessitar de manutenção?[/quote]

Não, não é q eu não tenha entendido o código dele… entendi sim, pois ele fez d forma mto didática… eu só pedi a ajuda dele, pois jah tentei de n jeitos (uma coisa q eu sei q é facil), mas q ñ consegui fazer… Eu entendi o código dele, mas ñ consigo modifica-lo para o q eu penso…

E outra, jamais pedi o código pronto a ele, estou apenas tentando tirar uma duvida minha, pois ñ sei realmente o q fazer…

o contador você vai chama-lo no seu PrincipalTela e você faz um projeto com as duas classes e da um build jar disso e pronto.
no codigo do cara o contador ja ta sendo chamado no PrincipalTela

[quote=guialeixo]o contador você vai chama-lo no seu PrincipalTela e você faz um projeto com as duas classes e da um build jar disso e pronto.
no codigo do cara o contador ja ta sendo chamado no PrincipalTela[/quote]

Pergunta de ignorante agora: o q seria um build jar? :frowning:

http://www.google.com.br/search?hl=pt-BR&source=hp&q=como+fazer+um+build+jar&aq=f&aqi=&aql=&oq=&gs_rfai=

http://java.sun.com/developer/Books/javaprogramming/JAR/basics/build.html

dica começa a estudar uma vez me disseram que a maior qualidade de um programador é sevirou.

Igual meu chefe fala, aquele famoso japones: Tivira

Bom saber q o fórum de java existe para falar ao nosso próximo “se vira”, ao invés de cobrir seu real objetivo, q é o de ajudar e ser ajudado…

Bom saber q o fórum de java existe para falar ao nosso próximo “se vira”, ao invés de cobrir seu real objetivo, q é o de ajudar e ser ajudado…[/quote]

o forum java serve pra tirar duvidas e não pros outros fazerem o codigo pra gente.

Bom saber q o fórum de java existe para falar ao nosso próximo “se vira”, ao invés de cobrir seu real objetivo, q é o de ajudar e ser ajudado…[/quote]

o forum java serve pra tirar duvidas e não pros outros fazerem o codigo pra gente.[/quote]

Concordo plenamente, ainda mais qndo isso ocorre com educação, e ñ com indelicadeza…

Calma pessoal!

Muita calma!

Build jar é criar o arquivo jar :slight_smile:

Se você estiver no eclipse é o famoso exportar

o código que fiz agora que fui ver está errado, já arrumei no primeiro post. :slight_smile:

mas então, o que você quer fazer no fim das contas:
1- incorporar ao seu código o contador
2- ao abrir seu programa, abrir um “pop-up/modal” com o cronometro
3- ou o que?

Bom saber q o fórum de java existe para falar ao nosso próximo “se vira”, ao invés de cobrir seu real objetivo, q é o de ajudar e ser ajudado…[/quote]

o forum java serve pra tirar duvidas e não pros outros fazerem o codigo pra gente.[/quote]

Concordo plenamente, ainda mais qndo isso ocorre com educação, e ñ com indelicadeza…[/quote]

Da mesma forma de quem ta sendo ajudado realmente queira correr atras e não achar uma forma facil de achar alguem pra fazer suas coisas, se acha que fui indelicado chega em um chefe seu e pergunta como fazer aquilo que ele ja te passou mastigado, dai você vai ver o que é indelicadeza.

Olha nem programar em java eu programo, participo do forum para tentar ajudar e tentar me manter atualizado, programa em Natural, 9 meses que não sei o que é um eclipse instalado na minha maquina,so to te falando pra voce se virar por que no ambiente de trabalho vc vai ser cobrada a isso

[quote=paulofernandesjr]Calma pessoal!

Muita calma!

Build jar é criar o arquivo jar :slight_smile:

Se você estiver no eclipse é o famoso exportar

o código que fiz agora que fui ver está errado, já arrumei no primeiro post. :slight_smile:

mas então, o que você quer fazer no fim das contas:
1- incorporar ao seu código o contador
2- ao abrir seu programa, abrir um “pop-up/modal” com o cronometro
3- ou o que?

[/quote]

Obrigada paulofernandesjr por me responder, é q como ñ entendo bm ingles, nunca tinha ouvido falar no termo Build jar, para se referir ao .jar…

Mas entao, o q qro realmente se enquadra melhor na 1º opção…

Olha, dessa vez acho q vai dar certo, pois deu apenas um erro, q creio q algum de vcs deve saber…

vou postar o primeiro código referente a PrincipalTela, e o segundo referente a Contador, e vou explicar onde esta dando erro (ambos no NetBeans):

[code]package timer;
import javax.swing.JOptionPane;

public class PrincipalTela extends javax.swing.JFrame {
private static final long serialVersionUID = 1L;
private static boolean contador = false;
private static boolean zerado = false;

  public PrincipalTela() {
    initComponents();
}
 public static boolean isContador(){   
    return contador;   
}   

public static boolean isZerado(){   
    return zerado;   
}   
   
public static void setZerado(boolean zero){   
    zerado = zero;   
}   
   
   private void iniciarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    contador = true;   
    iniciar.setEnabled(false);   
    pausar.setEnabled(true);   
    zerar.setEnabled(false);   
}

private void pausarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    contador = false;   
    iniciar.setEnabled(true);   
    pausar.setEnabled(false);   
    zerar.setEnabled(true); 
}

private void zerarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    contador = false;   
    lConta.setText("00:00:00");   
    zerado = true;   
    lConta.revalidate();   
    iniciar.setEnabled(true);   
    pausar.setEnabled(false);   
}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    this.dispose();
    JOptionPane.showMessageDialog(null, "próxima janela!");
    new PrincipalTela().setVisible(true);
}

   public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new PrincipalTela().setVisible(true);
            Contador cont = new Contador(lConta);   
            cont.start(); 
        }
    });
}
[/code]

Contador[code]package timer;
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;   
}      

}
[/code]

Reparem q um trecho do PrincipalTela.java, do código do paulo, esta assim:

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

e do meu PrincipalTela, esta assim, pq no netbeans ñ é necessário montar o “montaTela()”:

public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new PrincipalTela().setVisible(true); [i]Contador cont = new Contador(lConta); [/i] cont.start(); } }); }

O NetBeans acusa erro na linha em italico, sendo este o erro:

init: deps-jar: Compiling 1 source file to D:\Meus documentos\NetBeansProjects\TimerTeste\build\classes D:\Meus documentos\NetBeansProjects\TimerTeste\src\timer\PrincipalTela.java:163: non-static variable lConta cannot be referenced from a static context Contador cont = new Contador(lConta); 1 error CONSTRUÇÃO FALHOU (tempo total: 0 segundos)

Então, pessoal, o q vcs acham q fiz de errado? tem algo a mais, ou a menos no código?

bjosss e Obrigada!!!