Dar tempo ao jLabel [Resolvido]

6 respostas
G

Ola galera.

Depois de quebrar um pouco a cabeça resolvi perguntar aqui, alguem sabe como poderia dar um tempo para o jLabel, ex: aparece uma mensagem na aplicação por um jLabel e depois de alguns segundos ela some. Tem como fazer isso?

6 Respostas

C

Utilize uma thread para controlar o tempo de exibição da jLabel com a mensagem desejada.

G

campoDeTexto.setText("texto que tu quer"); final Timer tempo = new Timer(5000, new ActionListener() {//vai esperar 5 segundos e executar essa ação @Override public void actionPerformed(ActionEvent e) { campoDeTexto.setText("");//removo o conteudo do text, ou remove da tela, faz qualquer coisa tempo.stop();//paro a contagem, pra não ser executado de novo } }); tempo.start();//inicio o tempo

Devem ter outras maneiras, essa é a que eu sei :slight_smile:

G

Valeu gaulix com sua ajuda consegui fazer o que queria deu certim.

L

Implementei algo parecido aqui… Mas utilizei 1 JLabel e 2 JButton, sendo um para disparar o timer, e outro para configurar o texto a ser exibido pelo label e o delay do timer.
Assim que executo a aplicação, clico no botão para efetuar a configuração e, logo após inicio o timer. Num primeiro momento funciona perfeitamente. Mas ao tentar configurar novamente, assim que defino o novo texto para o label, o texto anterior que estava visível é atualizado automaticamente para o novo, sem nem mesmo esperar pelo novo delay, e muito menos clicar no botão iniciar.
Segue parte do código para avaliação…

Classe interna para tratamento dos eventos dos botões:

private class ButtonHandler implements ActionListener {
        
        @Override
        public void actionPerformed( ActionEvent event ){
            		
            if( event.getSource() == btnDisparar ) {
                new Timer( tempo, taskHandler ).start();
		
            } else if (event.getSource() == btnConfigurar) {
                texto.setText( JOptionPane.showInputDialog( null, "Digite a mensagem a ser exibida." ));
				
                tempo = Integer.parseInt( JOptionPane.showInputDialog( null, "Digite o tempo em segundos." ));
            	tempo *= 1000;
            }
        }
}

Trecho que define o timer:

private int tempo;
	
ActionListener taskHandler = new ActionListener() {
      @Override
      public void actionPerformed( ActionEvent event ){
            texto.setVisible(true);
      }
};

Algum dos camaradas tem idéia do que pode estar acontecendo?

G

Nessa linha:

texto.setText( JOptionPane.showInputDialog( null, "Digite a mensagem a ser exibida." ));

Você está passando o texto direto pro seu JLabel no botão configuração, devias guardar isso em uma String, como fazes com o delay, e só alterar o JLabel dentro do timer, pq quando tu clicar no botão disparar é que vai ser alterado o texto

L

gaulix, perfeita sua colocação!
Por funcionar num primeiro momento, não atentei para esse detalhe. Agora percebi que era pelo fato do label estar invisível inicialmente. Após o timer executar pela primeira vez, o label passa a estar visível e, na configuração seguinte, quando atribuo outro texto ao label ele é imediatamente exibido.
Porém, somente essa alteração não bastou… Por algum motivo que desconheço, o aplicativo só funcionou a contento após definir no timer a propriedade setRepeats como false.
Seguem os trechos de código atualizados para os que tiverem a mesma dúvida…

Classe interna para tratamento dos eventos dos botões:

private class ButtonHandler implements ActionListener {
        
        @Override
        public void actionPerformed( ActionEvent event ){
            		
            if( event.getSource() == btnDisparar ) {
                timer = new Timer( tempo, new TaskAction() );
                timer.setRepeats(false);
                time.start();
		
            } else if (event.getSource() == btnConfigurar) {
                tmp = JOptionPane.showInputDialog( null, "Digite a mensagem a ser exibida." );
				
                tempo = Integer.parseInt( JOptionPane.showInputDialog( null, "Digite o tempo em segundos." ));
            	tempo *= 1000;
            }
        }
}

E agora, criei uma classe interna para definir a ação do timer. Pois me pareceu em melhor acordo com os princípios da orientação à objetos.

private class TaskAction implements ActionListener {

      @Override
      public void actionPerformed( ActionEvent event ){
            texto.setText(tmp);
            texto.setVisible(true);
      }
};
Criado 29 de outubro de 2012
Ultima resposta 2 de nov. de 2012
Respostas 6
Participantes 4