通过一些搜索,我做了ActionListeners和GUI。我想我得出的结论是,当ActionListener结束时,你所做的所有影响GUI的更改都会在ActionListener中发生。 我正在制作记忆游戏。在卡片按钮的动作监听器中,我首先翻转图像(改变它的图标),然后检查是否有匹配,如果我没有,我会关闭卡片(更改图标)。
由于这两个发生在同一个actionListener中,因此如果我没有匹配,我只看到我选择的第一张牌,而他第二张似乎没有反应翻转。 对不起,如果我解释它的方式令人困惑。我认为问题是actionListener,但也许我错了。你会建议什么?
c.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae){
selectedCard = c;
String imgName = "Images/"+c.getId()+".jpg";
URL imageURL = this.getClass().getResource(imgName);
if (imageURL != null) {
ImageIcon icons = new ImageIcon(imageURL);
c.setIcon(icons);
}
c.setEnabled(false);
c.setDisabledIcon(c.getIcon());
pl.singlePlay(c);
if(pl.getMatch()==false){
for (Cards cd : cards){
if(cd.getMatched()==false){
cd.setEnabled(true);
cd.setIcon(icon);
}
}
}
});
答案 0 :(得分:3)
我得出的结论是,在ActionListener结束时,你在ActionListener中所做的所有影响GUI的更改都会发生
是的,从Event Dispatch Thread (EDT)
执行从任何侦听器调用的所有代码。该线程负责更新GUI,因此GUI无法更新,直到代码完成执行。有关详细信息,请阅读Concurrency上的Swing教程中的部分。
因为这两个发生在同一个actionListener
中
如果要安排动画,即显示一个图标,然后秒后显示另一个图标,则可以使用Swing Timer。计时器允许您安排另一个事件。上面的教程链接还有一个关于How to Use Swing Timers
的部分,可以帮助您入门。