我最近制作了一款小型益智游戏,用于点击某些区域。我还制作了一个解决方案来激活赢得必要的区域。我面临的问题是,我每次激活一个区域时都会暂停以创建一种“解决动画”。我的问题在这里表示
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,然后再次递增。
答案 0 :(得分:2)
我尝试过使用Timers,但我不确定如何正确格式化它,以便每次在changeLabel()内部循环递增时它只会暂停
使用Timer
时,不要使用循环。 Timer
的关键是你启动Timer并继续执行直到你停止Timer
。
您也不制作方法,只要Action
触发,您就会调用Timer
。
因此,您需要在类中使用一个实例变量来跟踪Timer触发的次数(让我们称之为“timerCounter”)。然后,您需要创建Action
以在每次Timer
被触发时调用。
所以你创建了几个实例变量:
int timerCounter = 0;
Action action;
然后在你的类的构造函数中创建一个类似于:
的Actionaction = 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();