2015-06-27 2 views
-1

Я пытаюсь сделать таймер так после завершения 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); 

    } 
} 

} 

ответ

3

Вы создаете время с каждым действием. Создайте таймер один раз и перезапустите его, когда действие было выполнено.

Эта линия:

Timer t = new Timer(1000, new TimerListener()); 

Должно быть вне actionpPerformed.

Вы можете использовать что-то вроде этого:

private class TimerListener implements ActionListener { 
    private JButton button; 
    public MyListener(JButton button){ 
     this.button = button; 
    } 

    public void actionPerformed(ActionEvent e) { 
     this.button.setIcon(guncold); 
    } 
} 

И теперь, когда у вас есть ссылка на эту кнопку, образ которого вы изменяете, передать ссылку на строительство:

add(p, BorderLayout.CENTER); 
add(p1, BorderLayout.NORTH); 
add(p2, BorderLayout.SOUTH); 
// HERE 
Timer t = new Timer(1000, new TimerListener(a)); 
a.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     Random r = new Random(); 
     int rand = r.nextInt(5); 
     switch (rand) { 
     // ... code 
     if (rand == 0) { 
      t.restart();  
     } else { 
      a.setIcon(guncold); 
     } 

    } 

}); 
+3

Хорошо, это взял меня на миг, чтобы примириться, да, вы правы, но вы упустили возможность выделить «почему» - каждый «Таймер», который запускается, повторяется. Вы также можете использовать 'Timer # setRepeats' и передать его' false', что вам нужно сделать и для глобального таймера;) – MadProgrammer

+0

@MadProgrammer Спасибо, что исправил его! Также спасибо Реуту Шарабани! –

+0

@MadProgrammer возможно, я пропустил этот момент, так как я не понимаю, что вы говорите. Зачем вам нужно, чтобы глобальный таймер не повторялся, если вы его перезапускаете? Я ожидаю, что игра закончится, как только вы умрете –

Смежные вопросы