如何使用Swing制作方法,使用定时器休眠

时间:2016-11-22 04:44:12

标签: java swing timer actionlistener 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);
   }
}

我尝试过使用Timers,但我不确定如何正确格式化它,以便每次在changeLabel()内部循环增加时它都会暂停,因为Timer()中的第二个参数要求一个ActionListener。 我也尝试过使用Thread.sleep()但它只是冻结我的程序然后立即解决它。

理想情况下,changeLabel方法将递增1,将标签设置为新String,等待200ms,然后再次递增。

1 个答案:

答案 0 :(得分:2)

  

我尝试过使用Timers,但我不确定如何正确格式化它,以便每次在changeLabel()内部循环递增时它只会暂停

使用Timer时,不要使用循环。 Timer的关键是你启动Timer并继续执行直到你停止Timer

您也不制作方法,只要Action触发,您就会调用Timer

因此,您需要在类中使用一个实例变量来跟踪Timer触发的次数(让我们称之为“timerCounter”)。然后,您需要创建Action以在每次Timer被触发时调用。

所以你创建了几个实例变量:

int timerCounter = 0;
Action 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();