Я пытаюсь сделать таймер так после завершения GIF, он заменяется сплошной рамкой, поэтому кажется, что GIF заканчивается. Он работает, но по какой-то причине таймер становится короче и короче. (Причина, вероятно, очевидна, но у меня плохое понимание таймеров).Таймер в программе становится все короче каждый раз
public class Gui extends JFrame {
int sum = 0;
int deaths = 0;
JTextField devs;
JButton a;
ImageIcon guncold;
ImageIcon gunactive;
public Gui() {
super("Russian Roulette");
setLayout(new BorderLayout());
Font f = new Font("Western", 20, 20);
guncold = new ImageIcon(getClass().getResource("guncold.gif"));
gunactive = new ImageIcon(getClass().getResource("gunfiring.gif"));
a = new JButton(guncold);
a.setToolTipText("Click To Play");
JPanel p = new JPanel();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
final JTextField display = new JTextField("Click Gun To Play!", 12);
devs = new JTextField("Deaths: " + deaths, 10);
devs.setEditable(false);
devs.setFont(f);
devs.setBackground(Color.BLACK);
devs.setForeground(Color.WHITE);
p.add(a);
p.setBackground(Color.BLACK);
p1.add(devs);
p1.setBackground(Color.BLACK);
p2.add(display);
p2.setBackground(Color.BLACK);
display.setFont(f);
display.setEditable(false);
display.setBackground(Color.BLACK);
display.setForeground(Color.WHITE);
add(p, BorderLayout.CENTER);
add(p1, BorderLayout.NORTH);
add(p2, BorderLayout.SOUTH);
a.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
Random r = new Random();
int rand = r.nextInt(5);
switch (rand) {
case 0:
display.setText("Bang! You're dead.");
deaths++;
devs.setText("Deaths: " + deaths);
break;
case 1:
display.setText("You're alive!");
break;
case 2:
display.setText("You're alive!");
break;
case 3:
display.setText("You're alive!");
break;
case 4:
display.setText("You're alive!");
break;
case 5:
display.setText("You're alive!");
break;
}
Timer t = new Timer(1000, new TimerListener());
if (rand == 0) {
t.start();
a.setIcon(gunactive);
t.restart();
} else {
a.setIcon(guncold);
}
}
});
}
private class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
a.setIcon(guncold);
}
}
}
Хорошо, это взял меня на миг, чтобы примириться, да, вы правы, но вы упустили возможность выделить «почему» - каждый «Таймер», который запускается, повторяется. Вы также можете использовать 'Timer # setRepeats' и передать его' false', что вам нужно сделать и для глобального таймера;) – MadProgrammer
@MadProgrammer Спасибо, что исправил его! Также спасибо Реуту Шарабани! –
@MadProgrammer возможно, я пропустил этот момент, так как я не понимаю, что вы говорите. Зачем вам нужно, чтобы глобальный таймер не повторялся, если вы его перезапускаете? Я ожидаю, что игра закончится, как только вы умрете –