Como utilizar uma classe com um timer dentro em outro programa java?

18 respostas
S

Tenho uma classe que pega a data e hora e coloca em seus atributos a cada segundo, utilizando um Timer interno. Agora gostaria de utilizar-la dentro de outras classe, mas já tentei instaciar o objeto mas sempre me retorna null dentro dos atributos, alguém sabe como utilizar ? Se precisar eu envio o código.

18 Respostas

pcalcado

Oi,

Não deu pra entender, pode ser mais claro? :slight_smile:

Shoes

Java_Vinicius_Machin

É acho que colocar o código ajuda! (não esqueça das tags code).

[]´s :lol:

Java_Vinicius_Machin

Cade as tags code ? :hunf:

S

Desculpe-me, sou iniciante em java, o que são TAGs CODES ? Não sei se tem a ver mas estou rodando via eclipse.

kina

para você usar aqui no forum exemplo:
Sem a tag code:

import java.util.*

public class MinhaClasse{

public static void main(String args[]){

System.out.println(Hello World);

}

}

com a tag code:

import java.util.*
public class MinhaClasse{
	public static void main(String args[]){
		System.out.println("Hello World");
	}
}

Fica mais fácil de visualizar

Java_Vinicius_Machin

isso de tags code é simplesmente colocar seu código aqui no forum assim

//aqui entra seu código

para isso você coloca um [code] e depois [/code] (sem os asteriscos, coloquei os mesmos apenas para não criar mais um campo code), dentro deles seu código fica muito mais legivel.

Entendeu ?

S

Legal, obrigado, vou tentar reescrever novamente o código

* 
* Created on 16/06/2005 
* 
* TODO To change the template for this generated file go to 
* Window - Preferences - Java - Code Style - Code Templates 
*/ 
package teste; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.Timer; 
/** 
* @author SINVAL 
* 
* TODO To change the template for this generated type comment go to 
* Window - Preferences - Java - Code Style - Code Templates 
*/ 
//public class MenuPrincipal extends implements ActionListener { 
public class TempoMenuSgf implements ActionListener { 

static javax.swing.Timer tTempo = null; 
private static SimpleDateFormat dtFormato = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
protected static Calendar cData ; 
static String TEMPO; 
static String DATA; 
static String HORA; 

public void actionPerformed(ActionEvent e) { 
// TODO Auto-generated method stub 
cData = Calendar.getInstance(); 
TEMPO = dtFormato.format(cData.getTime()); 
DATA = (TEMPO.substring(0,TEMPO.indexOf(" "))); 
HORA = (TEMPO.substring(TEMPO.indexOf(" ")+1)); 
} 

public void iniciaTimer() { 
if (tTempo == null) { 
tTempo = new Timer(PadraoSgf.TEMPOATUALIZADATAHORA,this); 
tTempo.setInitialDelay(0); 
tTempo.start(); 
} 
else if (!tTempo.isRunning()){ 
tTempo.restart(); 
} 
} 

public static void main(String[] args) { 
try { 
TempoMenuSgf menu = new TempoMenuSgf(); 
} 
catch (Exception e) { 
e.printStackTrace(); 
System.err.println("Erro interno do programa"); 
} 
} 
}
Como utilizar dentro desta aplicação.[/b] 

package teste; 

import java.awt.*; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class MenuEmpresaSgf extends JFrame { 

private JPanel pEmpresa; 
private JLabel lDataEmpresa; 
private JLabel lHoraEmpresa; 

private static JTextField tDataEmpresa; 
private static JTextField tHoraEmpresa; 


public MenuEmpresaSgf(String s){ 
// seta informações basicas do frame 
pEmpresa = new JPanel(); 

TempoMenuSgf tempo = new TempoMenuSgf(); 

lDataEmpresa = new JLabel("Data: "); 
pEmpresa.add(lDataEmpresa); 
tDataEmpresa = new JTextField(10); 
tDataEmpresa.setEditable(false); 

[b]*** aqui eu tento instanciar o objeto para utilizar, mas o mesmo esta null 
TempoMenuSgf tempo = new TempoMenuSgf (); 

tDataEmpresa.setText(tempo.DATA); 
pEmpresa.add(tDataEmpresa); 


this.getContentPane().add(pEmpresa,BorderLayout.NORTH); 
} 

public static void main(String[] args) { 
try { 
MenuEmpresaSgf menu = new MenuEmpresaSgf(PadraoSgf.SISTEMA + " " + PadraoSgf.MODULO); 
menu.setVisible(true); 
} 
catch (Exception e) { 
e.printStackTrace(); 
System.err.println("Erro interno do programa"); 

} 
} 

public void sair() { 
// analisar a necessidade de criar um processo para gerencial 
// a preferencia de propriedades do usuário, exemplo: cor, tipo letra, etc. 

System.out.println("Terminou a aplicação"); 
System.exit(0); 
} 
}
Java_Vinicius_Machin

Bom aqui não deu NullPointerException não eu só alterei o seu código no ponto onde você instancia a variavel de referencia tempo novamente.

ps: se vc tiver editando seu código no NetBeans use o CTRL + F procurando por tempo, assim você vai encontrar. :mrgreen:

S

Desculpe-me, acho que expliquei errado, na realidade o que esta voltando null é o campo de DATA/HORA e TEMPO da aplicação que estou chamando, é como se ela não estivesse funcionando, não estivesse ativa, a forma de utilizar é esta mesmo ?

andgonca

Pelo que eu percebi está acontecendo o seguinte:

1-) Vc inicializa seu timer no método iniciaTimer() da classe TempoMenuSgf
2-) Na classe MenuEmpresaSgf vc instancia a classe TempoMenuSgf através de um constructor default, que não está implementado nessa classe.

Pra resolver isso vc teria que colocar o seguinte constructor na classe TempoMenuSgf

public TempoMenuSgf(){
        iniciaTimer();
    }

Tentaí!

S

Coloquei dentro do programa TempoMenuSgf o construtor conforme vc solicitou, fiz o teste criando uma tela dentro deste mesmo programa e assim ele consegui preencher um label que criei. Mas quando crio um objeto dele no programa MenuEmpresaSgf e tento utilizar o campo DATA a mesma ainda esta retornando NULL, da a impressão que o programa TempoMenuSgf não iniciou, vc tem algum palpite do que pode ser ? :frowning:

S

** SEGUE ABAIXO PARTE DO PROGRAMA QUE ESTA CHAMANDO ESTA NOVA APLICAÇÃO PARA AVALIAÇÃO **

package teste;

import java.awt.*;
import javax.swing.JLabel;
import javax.swing.JPanel; 
import javax.swing.JFrame;
import javax.swing.JTextField;

public class MenuEmpresaSgf extends JFrame   {

	private JPanel pEmpresa;	
	private JLabel lDataEmpresa;
		
	private static JTextField tDataEmpresa;
			
	public MenuEmpresaSgf(String s){	
			
		super(s);
		super.setSize(10,10,400,200);
		super.setDefaultLookAndFeelDecorated(true);		
		super.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
		pEmpresa = new JPanel();
		
//		painel de empresas
		pEmpresa = new JPanel(new FlowLayout(FlowLayout.LEFT));		
		
		TempoMenuSgf tempo = new TempoMenuSgf();
		
		tDataEmpresa.setText(tempo.DATA);
		pEmpresa.add(tDataEmpresa);
		System.out.println(" dt " + tempo.DATA);
		System.err.println();
		this.getContentPane().add(pEmpresa);
		this.setVisible(true);
		
}    

	public static void main(String[] args) {
		try {
		MenuEmpresaSgf menu = new MenuEmpresaSgf("");
	
			}
		catch (Exception e) {
			e.printStackTrace();
			System.err.println("Erro interno do programa");
			
		}
	}
	
	public void sair() {
		// analisar a necessidade de criar um processo para gerencial
		// a preferencia de propriedades do usuário, exemplo: cor, tipo letra, etc.

		System.out.println("Terminou a aplicação");
		System.exit(0);
	}
}

OBRIGADO PELA FORÇA.

andgonca

O problema é o seguinte:

No constructor vc inicializa o timer. No ActionListener vc atualiza os valores. Portanto, somente após 1 segundo os valores são preenchidos, ou seja, depois que vc solitou-os, por isso dá NullPointer, pq eles realmente estão null e só deixarão de ser depois de um segundo, na primeira execução do timer.

Pra resolver: inicialize os dados no constructor.

Além disso, vc não está inicializando o JTextField tDataEmpresa

Inclua a seguinte linha antes de dar o setText():

tDataEmpresa = new JTextField();

Mas, vou te dar três toques:

Primeiro é que esses dados não são constantes, portanto, não os declare como MAIUSCULOS, pois é uma convenção fazer isso quando a propriedade é constante.

Segundo: deixe as propriedades tempo, data e hora como private e crie gets pra elas, assim:

Ao invés de:

static String TEMPO;
    static String DATA;
    static String HORA;

Use:

private String tempo;
    private String data;
    private String hora;

    public String getTempo(){
       return this.tempo;
    }

    public String getData(){
       return this.data;
    }

    public String getHora(){
       return this.hora;
    }

E, ao invés de chamar assim:

tDataEmpresa.setText(tempo.DATA);

Vc chamaria assim:

tDataEmpresa.setText(tempo.getData());

Terceiro: vc declarou as variáveis como static, dessa maneira vc não necessitaria instanciar um objeto da classe TempoMenuSgf, só que assim, vc não teria como inicializar o timer a não ser que vc tivesse um método estático nessa classe e o chamasse no entry point da sua aplicação.

Deu pra entender?

S

Olha…é a primeira vez que estou usando Java, como também fóruns e como venho de outras tecnologias, CSP(mainframe) e Oracle (forms/reports) nunca tive este apoio que estou tendo em relação a Java, gostaria de estar agradecendo muito o apoio que vc e o pessoal do grupo esta me dando…muito obrigado.

Sobre o processo que vc me enviou eu entendi, estarei implementando hoje de manhã, qualquer dúvida eu comunico…obr.
:lol:

S

Beleza, implementei o código e a data/hora apareceram na tela, como eu atualizo a informação no construtor ela fica estática, como eu faria para estar atualizando constantemente a data e hora ? Precisarei criar um timer também na aplicação que chama ?
:wink:

S

Beleza, implementei o código trouxe a data e hora, mas o mesmo mante estático, uma vez que estou buscando no Construtor, como posso fazer para que a data e hora seja dinamico? tenho que criar um timer dentro da aplicação que esta chamando ?

andgonca

Isso… na verdade vc poderia criar um Timer só, na própria classe… Porque senão vc vai criar um Timer pra pegar os dados gerados por um outro Timer em uma outra classe. Percebeu a complexidade?

Acho melhor vc criar um único Timer na classe que o utilizará.

Desculpe pela demora na resposta, mas tá um correria hj!

[]´s

S

OK, irei mudar minha aplicação e implementar de forma diferente, por enquanto muito obrigado.

:wink:

Criado 27 de junho de 2005
Ultima resposta 30 de jun. de 2005
Respostas 18
Participantes 5