Я делаю игру. Я хочу иметь что-то вроде часов, показывающих, сколько времени прошло от попрошайничества. Он работает почти отлично, но он начинается, может быть, на секунду или два позже, чем начинается настоящая игра. Я не знаю, в чем причина этого, поэтому я буду признателен за любую помощь. Благодаря!Java - Swing Timer начинает отображаться немного позже, чем ожидалось
Я создал похожую ситуацию (runnable).
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
import javax.swing.Timer;
public class GUI extends javax.swing.JFrame {
private Timer SimpleTimer;
public GUI() {
initComponents();
}
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(154, 154, 154)
.addComponent(jLabel1))
.addGroup(layout.createSequentialGroup()
.addGap(131, 131, 131)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(196, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(92, Short.MAX_VALUE)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(48, 48, 48)
.addComponent(jLabel1)
.addGap(137, 137, 137))
);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
startGame();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUI().setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private void startGame() {
long startTime = System.currentTimeMillis();
if(SimpleTimer != null) {
SimpleTimer.stop();
}
SimpleTimer = new Timer(1000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
long millis = System.currentTimeMillis() - startTime;
jLabel1.setText("Time passed: " + String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
}
});
SimpleTimer.start();
}
}
Временная задержка '0' здесь:' Таймер (0, новый ActionListener() ...) 'нереалистичен и рискован. Это должно быть от 13 до 15 на самом низком уровне. –
'' Я думаю, что это весь код, относящийся к таймеру ... "' - посмотрите на [mcve], а затем попытайтесь создать и опубликовать один из них. Если вы упростите нам возможность понять свой код и вашу проблему, вы, вероятно, получите ответы на все более быстрые и быстрые ответы. –
И это неправильно: '// Мне просто нужно было инициализировать его, чтобы я мог проверить, если он уже запущен'. Нет. Все, что вам нужно сделать, это сначала проверить значение null, а затем, если не null, проверьте, работает ли он. –