2016-11-22 4 views
1

Недавно я сделал небольшую игру-головоломку, которая касается щелчка по определенным областям. Я также сделал решатель, который активирует необходимые области для победы. Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы приостановить каждый раз, когда он активирует область, чтобы создать своего рода «решающую анимацию». Моя проблема представлена ​​здесьКак сделать метод с помощью Swing, Sleep с помощью таймера

package experiment; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ExperimentHere extends JFrame implements ActionListener 
{ 

private static final long serialVersionUID = 1L; 
private JButton changeLabelButton; 
private JPanel mainPanel; 
private JLabel labelToChange; 

public ExperimentHere() { 
    changeLabelButton = new JButton("Set the label"); 
    changeLabelButton.addActionListener(this); 

    mainPanel = new JPanel(); 

    labelToChange = new JLabel(); 
    labelToChange.setText("This needs to be changed"); 


    mainPanel.add(labelToChange); 
    mainPanel.add(changeLabelButton); 
    this.add(mainPanel); 

    setTitle("Timer Program"); 
    setContentPane(mainPanel); 

    setPreferredSize(new Dimension(1000, 1000)); 
    pack(); 

} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource().equals(changeLabelButton)){ 
     changeLabel(); 
    } 
} 

public void changeLabel(){ 
    for (int i = 0; i<5; i++){ 
     labelToChange.setText(""+i); 
     // Pause for 200ms here 

    } 
} 

public static void main(String[] args){ 
    ExperimentHere test = new ExperimentHere(); 
    test.setVisible(true); 
    } 
} 

Я попытался с помощью таймеров, но я не уверен, как отформатировать его должным образом, так что он только делает паузу каждый раз, когда цикл внутри changeLabel() увеличивается, так как второй параметра Я в Timer() запрашивает ActionListener. Я также пробовал использовать Thread.sleep(), но он просто замораживает мою программу, а затем мгновенно решает ее.

В идеале метод changeLabel будет увеличиваться на 1, установить метку в новую строку, подождать 200 мс, а затем снова увеличивать.

ответ

2

Я попытался с помощью таймеров, но я не уверен, как отформатировать его должным образом, так что он только делает паузу каждый раз, когда цикл внутри от changeLabel() инкрементируется

При использовании Timer вы не используете цикл. Точка Timer заключается в том, что вы запускаете Таймер и продолжаете выполнение, пока не остановите Timer.

Вы также не делаете методы, вы делаете Action, чтобы вызывать каждый раз, когда срабатывает Timer.

Значит, вам нужна переменная экземпляра в вашем классе, которая отслеживает количество срабатываний таймера (позволяет называть его «timerCounter»). Затем вам нужно создать Action для вызова при каждом запуске Timer.

Так вы создаете несколько переменных экземпляра:

int timerCounter = 0; 
Action action; 

Затем в конструкторе вашего класса вы создаете действий что-то вроде:

action = new AbstractAction() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     labelToChange.setText("" + timerCounter); 
     timerCounter++; 

     if (timerCounter > 5) 
     { 
      Timer timer = (Timer)e.getSource(); 
      timer.stop(); 
     } 
    } 
} 

Так что теперь в ActionListener вашей кнопки вы может сделать что-то вроде:

timerCounter = 0; 
Timer timer = new Timer(200, action); 
timer.start(); 
+0

О, я вижу, я не понимал использование таймеров. Делает гораздо больше смысла, когда он используется так. Благодаря! – Kazutadashi

+0

@ Казутадаши, рад, что это помогло. Не забудьте «принять» ответ, нажав на галочку, чтобы люди знали, что проблема решена. – camickr