Os exemplos descritos neste artigo podem realizar a exibição dinâmica do tempo do Java na interface. Os métodos de implementação específicos são resumidos da seguinte forma:
1. O Método 1 usa TimerTask:
Use java.util.Timer e java.util.TimerTask para atualizações dinâmicas. Afinal, cada atualização pode ser considerada como ocorrendo uma vez a cada 1 segundo.
O código é o seguinte:
importar java.awt.Dimension;importar java.text.SimpleDateFormat;importar java.util.Calendar;importar java.util.Date;importar java.util.Timer;importar java.util.TimerTask;importar javax.swing.JFrame;importar javax.swing.JLabel;import javax.swing.JPanel;/** * Esta classe é uma implementação JFrame simples para explicar como para * exibir o tempo dinamicamente na interface baseada em JSwing. * @author Edison * */public class TimeFrame extends JFrame{ /* * Variáveis */ private JPanel timePanel; private JLabel displayArea; mm:ss"; private String time; private int ONE_SECOND = 1000; public TimeFrame() { timePanel = new JPanel(); timeLabel = new JLabel("CurrentTime: "); displayArea = new configTimeArea(); (EXIT_ON_CLOSE); this.setSize(nova dimensão(200,70)); this.setLocationRelativeTo(null); /** * Este método cria uma tarefa de timer para atualizar o tempo por segundo */ private void configTimeArea() { Timer tmr = new tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Tarefa de timer para atualizar a área de exibição de hora * */ classe protegida JLabelTimerTask estende TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); @Override public void run() { time = dateFormatter.format(Calendar.getInstance().getTime()); main(String arg[]) { TimeFrame timeFrame=new TimeFrame(); timeFrame.setVisible(true);
Herde TimerTask para criar uma tarefa personalizada, obter a hora atual e atualizar displayArea.
Em seguida, crie uma instância de timer e execute timersk a cada 1 segundo. Como pode haver erros de tempo ao usar o agendamento, o agendamentoAtFixedRate de maior precisão é chamado diretamente.
2. Método 2: Usando threads:
Este é relativamente simples. O código específico é o seguinte:
import java.awt.Dimension;import java.text.SimpleDateFormat;import java.util.Calendar;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * Esta classe é uma implementação simples de JFrame para explicar como * exibir o tempo dinamicamente na interface baseada em JSwing * @author Edison * */public class DTimeFrame2 estende JFrame. implementa quadro JFrame privado; private JPanel timeLabel; private JLabel displayArea; private String DEFAULT_TIME_FORMAT = "HH:mm:ss"; = new JLabel("HoraAtual: "); displayArea = novo JLabel(); timePanel.add(timeLabel); timePanel.add(displayArea); this.setLocationRelativeTo(null ); } public void run() { while(true) { SimpleDateFormat dateFormatter = novo SimpleDateFormat(DEFAULT_TIME_FORMAT); displayArea.setText(dateFormatter.format( Calendar.getInstance().getTime())); "); } } } public static void main(String arg[]) { DTimeFrame2 df2=new DTimeFrame2(); df2.setVisible(true);
Comparar:
Pessoalmente, prefiro o método um, porque o Timer pode ser compartilhado por vários TimerTasks e a geração de um thread aumentará a complexidade de manutenção de multithreads.
Preste atenção ao seguinte código:
jFrame.setDefaultCloseOperation(); // Adiciona um comportamento específico ao botão fechar jFrame.setLocationRelativeTo(null); // Faz com que o quadro apareça no meio da tela em vez do canto superior esquerdo.
Modificando ligeiramente o método acima, você pode exibir a hora em vários países. O código é o seguinte:
importar java.awt.BorderLayout;importar java.awt.event.ActionEvent;importar java.awt.event.ActionListener;importar java.text.SimpleDateFormat;importar java.util.Calendar;importar java.util.Date;importar java.util .Locale;importar java.util.TimeZone;importar java.util.Timer;importar java.util.TimerTask;importar javax.swing.DefaultComboBoxModel;importar javax.swing.JComboBox;importar javax.swing.JFrame;importar javax.swing.JLabel;importar javax.swing.JPanel;/** * Um relógio mundial simples * @author Edison * */public class WorldTimeFrame estende JFrame{ /** * */ private static final long serialVersionUID = private String time; private JPanel timePanel; private TimeZone timeZone; private JComboBox displayArea; private int ONE_SECOND = 1000; JComboBox(); timePanel = new JPanel(); @Override public void actionPerformed(ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String) zoneBox.getSelectedItem())); NORTE); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); /** * Este método cria uma tarefa de timer para atualizar o tempo por segundo */ private void configTimeArea() { Temporizador tmr = novo Temporizador(); JLabelTimerTask(),new Date(), ONE_SECOND); /** * Tarefa de timer para atualizar a área de exibição de hora * */ public class JLabelTimerTask extends TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH); void run() { dateFormatter.setTimeZone(timeZone); dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); /** * Atualizar o fuso horário * @param newZone */ public void updateTimeZone(TimeZone newZone) { this.timeZone = newZone ; } public static void main(String arg[]) { new WorldTimeFrame();
Originalmente, displayArea precisa ser atualizado em updateTimeZone(TimeZone newZone). Porém, considerando que o tempo de execução do TimerTask é muito curto, apenas 1 segundo, a olho nu, é basicamente o mesmo que atualizar imediatamente. Se o tempo de execução do TimerTask for longo, a displayArea deverá ser atualizada imediatamente e com cuidado.
Reabastecer:
①. pack() é usado para calcular automaticamente o tamanho da tela;
②. TimeZone.getAvailableIDs() é usado para obter todos os fusos horários.