javax.swing.Timer vs java.util.Temporizador dentro de um Swing
-
21-12-2019 - |
Pergunta
isso é melhor usar javax.swing.Timer
dentro de um balanço de aplicativo em vez de usar java.util.Timer
?
por exemplo:
Timer timer = new Timer(1000, e -> label.setText(new Date().toString()));
timer.setCoalesce(true);
timer.setRepeats(true);
timer.setInitialDelay(0);
timer.start();
ou
new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
label.setText(new Date().toString());
}
}, 0, 1000);
existe alguma diferença entre este dois?
Solução
A diferença:
Um java.util.Timer
inicia a sua própria Thread
para executar a tarefa.
Um javax.swing.Timer
agenda tarefas para execução no EDT.
Agora. Swing é único thread.
Você deve acessar e modificar o Balanço componentes do EDT só.
Portanto, para fazer alterações para o GUI a cada X segundos, use o Swing timer.Para fazer o plano de negócios da lógica de usar o outro temporizador.Ou melhor, uma ScheduledExecutorService
.
Urso de uma coisa muito importante na mente;se você passar um tempo no EDT ele não pode passar o tempo a atualizar o GUI.
Outras dicas
A principal diferença é que o javax.swing.Timer
executa seu código no EDT, enquanto o java.util.timer
é executado em uma thread separada.Devido a esse swing temporizadores são melhor utilizados se você está manipulando o GUI, de forma alguma.Embora se você preferir usar um tipo diferente de timer em seguida, você ainda pode invocar o código no EDT.
new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText(new Date().toString());
}
});
}, 0, 1000);