如何使用 Swing 制作方法,使用计时器睡眠
Posted
技术标签:
【中文标题】如何使用 Swing 制作方法,使用计时器睡眠【英文标题】:How To Make a Method Using Swing, Sleep Using a Timer 【发布时间】:2017-04-05 15:50:25 【问题描述】:我最近制作了一个小益智游戏,处理点击某些区域。我还制作了一个求解器,它可以激活必要的区域来获胜。我面临的问题是,我想在每次激活一个区域时暂停以创建一种“解决动画”。我的问题在这里体现
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,将标签设置为新字符串,等待 200 毫秒,然后再次递增。
【问题讨论】:
【参考方案1】:我尝试过使用计时器,但我不确定如何正确格式化它,以便它只会在每次 changeLabel() 内的循环递增时暂停
当您使用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();
【讨论】:
哦,我明白了,我误解了计时器的使用。当它像那样使用时更有意义。谢谢! @Kazutadashi,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。以上是关于如何使用 Swing 制作方法,使用计时器睡眠的主要内容,如果未能解决你的问题,请参考以下文章
如何在Javascript中制作精确的睡眠功能,可能使用承诺?