如何正确使用java中的ActionListeners

时间:2015-12-30 15:14:39

标签: java user-interface actionlistener

通过一些搜索,我做了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);

                       }
                    }

                    }

});

1 个答案:

答案 0 :(得分:3)

  

我得出的结论是,在ActionListener结束时,你在ActionListener中所做的所有影响GUI的更改都会发生

是的,从Event Dispatch Thread (EDT)执行从任何侦听器调用的所有代码。该线程负责更新GUI,因此GUI无法更新,直到代码完成执行。有关详细信息,请阅读Concurrency上的Swing教程中的部分。

  

因为这两个发生在同一个actionListener

如果要安排动画,即显示一个图标,然后秒后显示另一个图标,则可以使用Swing Timer。计时器允许您安排另一个事件。上面的教程链接还有一个关于How to Use Swing Timers的部分,可以帮助您入门。