Temporizador
Olá comunidade,
Preciso de um temporizador. Consultei várias páginas, mas não encontrei um procedimento simples.
1) Preciso contar tempos em segundos e após isso executar um procedimento.
2) Preciso, também, controlar a execução de um procedimento por 15 segundos, ultrapassado esse tempo o sistema mostrará uma outra tela.
Agradeço a todos,
Ana.
Ana Maruchi
Curtidas 0
Respostas
Alexandre Viriato
09/02/2011
[quote="AnaLins"]Olá comunidade,
Preciso de um temporizador. Consultei várias páginas, mas não encontrei um procedimento simples.
1) Preciso contar tempos em segundos e após isso executar um procedimento.
2) Preciso, também, controlar a execução de um procedimento por 15 segundos, ultrapassado esse tempo o sistema mostrará uma outra tela.
Agradeço a todos,
Ana.
Dê uma olhada [url="http://www.quartz-scheduler.org/"]aqui[/url], [url="http://hotwork.sourceforge.net/hotwork/manual/quartz/quartz-user-guide.html"]aqui[/url] e, principalmente, [url="http://www.roseindia.net/quartz/index.shtml"]aqui[/url]. Se não ajudar, também pode procurar [url="http://www.google.com.br/search?sourceid=chrome&ie=UTF-8&q=java+quartz"]aqui[/url].
GOSTEI 0
Ana Maruchi
09/02/2011
Consultei. Mas eu preciso de algo muito simples. como:
Exibe a tela1;
Conte 3 segundos;
depois exiba a tela2;
e
"Digite seu nome:"
aguardar 15 segundos, terminado esse tempo retorna a uma outra tela inicial.
Sds,
Ana.
GOSTEI 0
Alexandre Viriato
09/02/2011
[quote="AnaLins"]Consultei. Mas eu preciso de algo muito simples. como:
Exibe a tela1;
Conte 3 segundos;
depois exiba a tela2;
e
"Digite seu nome:"
aguardar 15 segundos, terminado esse tempo retorna a uma outra tela inicial.
Sds,
Ana.
Bom, dá uma olhada nas classes java.util.Timer e java.util.TimerTask.
[url="http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshavepassed.htm"]Exemplo[/url]
GOSTEI 0
Javaxxx
09/02/2011
[quote="AnaLins"]Consultei. Mas eu preciso de algo muito simples. como:
Exibe a tela1;
Conte 3 segundos;
depois exiba a tela2;
e
"Digite seu nome:"
aguardar 15 segundos, terminado esse tempo retorna a uma outra tela inicial.
Sds,
Ana.
Olá!
Você tem a opção de utilizar o método [i]sleep()[/i] da classe [i]Thread[/i].
Exemplo:
class Teste
{
public static void main( String[] args ) throws InterruptedException
{
System.out.println( "ok" );
Thread.sleep( 5 * 1000 ); // aguarda 5segundos
System.out.println( "ok" );
Thread.sleep( 10 * 1000 ); // aguarda 10segundos
System.out.println( "ok" );
}
}
GOSTEI 0
Ana Maruchi
09/02/2011
Obrigado serviu ! Só preciso desse contador para utilizar com métodos em outras classes do pacote, métodos que não estão na main, mas serão chamados por outros métodos bem mais a frente. Por exemplo, quero utilizar o sleep na Classe C.
package p;
public class ClasseC extends javax.swing.JFrame {
public Saques() {
initComponents();
Thread.sleep( 10 * 1000 ); // dá erro,
}}
package p;
public Class Main{
public static void main( String[] args ) throws InterruptedException
{
CalsseA a = new ClasseA();
a.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
a.(true);System.out.println( "ok" );
Thread.sleep( 10 * 1000 ); // aguarda 10 segundos
ClasseB b = new ClasseB();// HÁ UM MÉTODO QUE CHAMA ClasseC
b.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
b.setVisible(true);
a.setVisible(false);
}
} GOSTEI 0
Javaxxx
09/02/2011
Olha, para utilizar o método [b]sleep()[/b] é preciso tratar uma [b]InterruptedException[/b] que poderá ser lançada pelo método.
Portanto, se não tratada, ocorrerá erro de compilação.
Ex1.:
Ex2.:
...
public static void main( String[] args )
{
metodo();
}
// Aqui o método trata a possível exceção
private static void metodo()
{
try
{
System.out.println( "ok" );
Thread.sleep( 10 * 1000 );
System.out.println( "ok" );
}
catch( InterruptedExcpetion e ){}
}
...
...
public static void main( String[] args )
{
// Uma vez que 'metodo()' lança exceção, é preciso tratá-la em algum lugar
try
{
metodo();
}
catch( InterruptedException e ){}
}
// Aqui o método não trata, mas lança a exceção
private static void metodo() throws InterruptedException
{
System.out.println( "ok" );
Thread.sleep( 10 * 1000 );
System.out.println( "ok" );
}
...
GOSTEI 0
Ana Maruchi
09/02/2011
Esses dois últimos exemplos tem travado meu projeto. Será que há um contador simples ?
GOSTEI 0
Javaxxx
09/02/2011
[quote="AnaLins"]Esses dois últimos exemplos tem travado meu projeto. Será que há um contador simples ?
Na verdade, isso são apenas exemplos. Não é para acrescentar ao seu projeto. Você pode pensar que toda vez que for utilizar o [b]sleep()[/b],
é preciso usá-lo da seguinte forma:
try
{
// Somente aqui dentro vc pode utilizar o [b]sleep()[/b]
}
catch( InterrputedException e ){}
public void metodo()
{
try
{
int i = 0;
while( ++i <= 5 )
{
// Aqui o código que exibe a tela 1
Thread.sleep( 3 * 1000 );
// Aqui o código que exibe a tela 2 e entrada de dados
Thread.sleep( 15 * 1000 );
}
}
catch( InterruptedException e ){}
}
GOSTEI 0
Alexandre Viriato
09/02/2011
[quote="AnaLins"]Esses dois últimos exemplos tem travado meu projeto. Será que há um contador simples ?
Eu já vi gente teimosa, mas igual tu!
Lembra das classes [b]java.util.Timer[/b] e [b]java.util.TimerTask[/b] que eu pedi pra você dar uma olhada? Então, elas resolvem seu problema.
package src.temporizador;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Janela1 extends JFrame {
private static final long serialVersionUID = 1L;
protected JButton button1 = null;
protected Janela2 janela2 = null;
public Janela1() {
initComponents();
configureLayout();
}
private void configureLayout() {
this.setSize(300, 300);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());
this.add(button1);
}
private void initComponents() {
button1 = new JButton("Janela2");
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
janela2 = new Janela2();
janela2.setVisible(true);
}
});
}
});
}
public static void main(String[] args) {
new Janela1().setVisible(true);
}
}
package src.temporizador;
import java.awt.FlowLayout;
import java.util.Timer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Janela2 extends JFrame {
private static final long serialVersionUID = 1L;
protected JLabel label1 = null;
protected JTextField text1 = null;
protected Timer timer = null; //incluir
protected CloseJanelaTask task = null; //incluir
public Janela2() {
initComponents();
configureLayout();
}
private void configureLayout() {
this.setSize(300, 300);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());
this.add(text1);
}
private void initComponents() {
text1 = new JTextField(10);
timer = new Timer(); // incluir
task = new CloseJanelaTask(this); // incluir
timer.schedule(task, 5 * 1000); // incluir - 5 segundos para teste
}
public static void main(String[] args) {
new Janela2().setVisible(true);
}
}
package src.temporizador;
import java.util.TimerTask;
import javax.swing.JFrame;
public class CloseJanelaTask extends TimerTask {
private JFrame janela = null;
public CloseJanelaTask(JFrame janela) {
this.janela = janela;
}
@Override
public void run() {
janela.setVisible(false);
}
}
GOSTEI 0
Ana Maruchi
09/02/2011
Obrigada Viriato !!! O exemplo que você deu resolveu boa parte dos meus problemas. Agradeço muito.
Um abração,
Ana.
GOSTEI 0
Ana Maruchi
09/02/2011
Fiz o exemplo acima, mas o código está executando muito rápido. Não nos 5 segundos normais. Consultei várias fontes e não consegui identificar o problema. O que deve ser ?
Agradeço a ajuda,
Ana.
GOSTEI 0
Alexandre Viriato
09/02/2011
[quote="AnaLins"]Fiz o exemplo acima, mas o código está executando muito rápido. Não nos 5 segundos normais. Consultei várias fontes e não consegui identificar o problema. O que deve ser ?
Agradeço a ajuda,
Ana.
Ana, esse código executa e a janela aguarda 5 segundos para fechar. Revisa ele e vê se você colocou os 5 * 1000, na linha indicada. (O tempo é dado em milisegundos, por isso a multiplicação pra ficar claro. Mas, você pode colocar direto os 5000)
GOSTEI 0
Ana Maruchi
09/02/2011
Realmente fecha em 5 segundos.
No meu caso ele executa rápido pois eu chamo uma outra janela em seguida. Parece que executam em paralelo. Como devo corrigir o código para impedir isso ?
timer = new Timer(); task = new CloseJanelaTask(this); timer.schedule(task, 5 * 1000); //o objetivo é após fechar a janela atual //Chamar uma 3a janela Janela3 janela3 = new Janela3(); janela3.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); janela3.setVisible(true);
GOSTEI 0
Alexandre Viriato
09/02/2011
[quote="AnaLins"]Realmente fecha em 5 segundos.
No meu caso ele executa rápido pois eu chamo uma outra janela em seguida. Parece que executam em paralelo. Como devo corrigir o código para impedir isso ?
Nesse ponto, ele simplesmente agenda a execução da task, ele não inicia a execução nesse momento. E a task é executada em uma outra thread. Por isso está abrindo a 3. janela imediatamente. O código para abertura da 3. janela tem que ser colocado após o de fechamento da 2.
timer = new Timer(); task = new CloseJanelaTask(this); timer.schedule(task, 5 * 1000); //o objetivo é após fechar a janela atual //Chamar uma 3a janela Janela3 janela3 = new Janela3(); janela3.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); janela3.setVisible(true);
GOSTEI 0
Ana Maruchi
09/02/2011
Obrigada, consegui. Mas fiz uma solução deselegante. Criei várias classes CloseJanelaTask1, CloseJanelaTask2, ... para fechar e abrir as janelas.
GOSTEI 0
Alexandre Viriato
09/02/2011
[quote="AnaLins"]Obrigada, consegui. Mas fiz uma solução deselegante. Criei várias classes CloseJanelaTask1, CloseJanelaTask2, ... para fechar e abrir as janelas.
Ana, a não ser que você precise de uma task especializada, pode usar a mesma classe para todas. Note que ela tem um atributo do tipo JFrame, ou seja, qualquer janela que seja sub-classe de JFrame poderá ser acessada pela task que já foi criada, bastando que você passe a janela como argumento do construtor.
package src.temporizador;
import java.util.TimerTask;
import javax.swing.JFrame;
public class CloseJanelaTask extends TimerTask {
private JFrame janela = null; //<--- QUALQUER JFrame
public CloseJanelaTask(JFrame janela) {
this.janela = janela;
}
@Override
public void run() {
janela.setVisible(false);
}
}
GOSTEI 0