如何使用 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 制作方法,使用计时器睡眠的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中制作计时器而不冻结整个代码

有睡眠/等待吗?

坚持使用 Java Swing Timer

如何在Javascript中制作精确的睡眠功能,可能使用承诺?

java thread.sleep 也让 swing ui 进入睡眠状态

java thread.sleep 也让 swing ui 进入睡眠状态