java - 如何使用 Swing 创建方法,使用计时器 sleep

标签 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);
   }
}

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

理想情况下,changeLabel 方法会递增 1,将标签设置为新字符串,等待 200 毫秒,然后再次递增。

最佳答案

I have tried using Timers, but I'm not sure how to format it properly so that it only pauses each time the loop inside of changeLabel() is incremented

当您使用计时器时,您不会使用循环。 Timer 的要点是,您启动 Timer,它会一直执行,直到您停止 Timer

您也不创建方法,而是创建一个 Action 以便在 Timer 触发时调用。

因此,您的类中需要一个实例变量来跟踪 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();

关于java - 如何使用 Swing 创建方法,使用计时器 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733925/

相关文章:

java - 为什么不能告诉编译器重写 onClick

java - 如何在Android应用程序中重复调用函数?

java - lambda 函数中的 Spring Retry 似乎不起作用

java - 离开我的应用程序时,在执行 asyncTask 期间,我的应用程序出现错误

java - 在java中使用swing将按钮放置在指定位置

java - 如何在jDisktopPane中显示JinternalFrame,但该DisktopPane包含GridLayout?

java - 在 JTable 上以逗号显示值

c# - 如何同步定时器事件?

c# - 在 TextBox 条目暂停期间引发 PropertyChanged 事件?

java - Log4j RollingFileAppender 每分钟