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?
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?
Utilize uma thread para controlar o tempo de exibição da jLabel com a mensagem desejada.
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 
Valeu gaulix com sua ajuda consegui fazer o que queria deu certim.
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?
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
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);
}
};