Thread.sleep()在我的JButton文本改变之前开始(动画太长)如何防止这种情况?



我这里有一个方法,在一个循环中创建52个jbutton。当一个按钮被点击,相应的文本显示在它上面。在两个按钮的文本发生变化后,程序会休眠1秒(以便用户有时间查看它们)。但是,程序在按钮文本更改动画完成之前休眠,并且最终不显示第二个按钮上的文本:

for(int i=0; i<52; i=i+1){
//button creation
final int a=i;
JButton button_one=new JButton();
buttons[a]=button_one;

mainpanel.add(button_one);
button_one.addActionListener(new ActionListener(){
// what happens when the button is clicked
@Override
public void actionPerformed(ActionEvent button_picked){
amount_of_cards_picked=amount_of_cards_picked+1;
cardamountcheck();
String selectedcard=null;
if(twocardspicked==true){
userpick2=a;
selectedcard=setoutcards[userpick2];
System.out.println(selectedcard);
// button shows name of card
buttons[a].setText(selectedcard);
pairdetermination();
pairprobability();


}
else if(twocardspicked==false){
userpick1=a;
selectedcard=setoutcards[userpick1];
System.out.println(selectedcard);
System.out.println(cardspritesmap.get(selectedcard));
buttons[a].setText(selectedcard);
// the two changed text buttons are stored in an array
}
if(twocardspicked==true){
pickedcardbuttons[1]=buttons[a];

}
else if(twocardspicked==false){
pickedcardbuttons[0]=buttons[a];
}
// sleep method is called
oncardflipped(selectedcard);

}
});
}

这个方法启动Thread.sleep():

public void oncardflipped(String card){
if(twocardspicked==true){
// if there are two cards picked, the sleep is activated
try{
Thread.sleep(1000);
}
catch(InterruptedException ex){
Thread.currentThread().interrupt();
}
// once the sleep finishes, the text from the JButtons is removed.
pickedcardbuttons[0].setText("");
pickedcardbuttons[1].setText("");

}
}

程序完全按照我想要的方式工作,唯一的问题是程序没有给足够的时间来实际显示文本。

结果如下:按钮在被点击之前

点击一个按钮后(ok至今)

单击两个按钮后(这是您在睡眠期间看到的),可以看到,动画在

中被剪切了一半。,然后按钮返回到没有任何文本。

通过在Swing事件线程上调用Thread.sleep,您将使整个GUI进入睡眠状态,这意味着它不能执行任何更新GUI或与用户交互的关键操作,直到睡眠时间结束。解决办法是永远不要这样做。如果您需要在Swing GUI中设置时间延迟,有一个专门为此创建的Swing工具,Swing Timer: Swing Timer Tutorial

底层机制是给计时器一个以微秒为单位的延迟时间作为它的第一个构造函数参数,并给它一个回调方法作为ActionListener作为它的第二个参数。将其设置为非重复,并对其调用.start()。在延迟时间结束后,回调应该执行所需的操作。

例如:

public void oncardflipped(String card) {
if (twocardspicked) {
int delay = 1000;
Timer timer = new Timer(delay, e -> {
// the actionPerformed call-back code
pickedcardbuttons[0].setText("");
pickedcardbuttons[1].setText("");
});
timer.setRepeats(false);
timer.start();
}
}

注意你应该而不是使用java.util.Timer,另一个主要的Java定时器类,因为虽然这种工作,它不是Swing线程安全的。

相关内容

  • 没有找到相关文章

最新更新