按下记忆游戏时,JButton不会改变图标

时间:2015-07-10 19:05:57

标签: java swing

我正在尝试创建自己的简单内存游戏,并且我有一个JPanel,它实现了ActionListener接口并包含一些从JButton继承的Tiles。除了点击按钮作为第二个按钮之外,几乎所有东西都能正常工作,不会像它应该那样改变它的图标。然而,当我点击两个相匹配的瓷砖时,它们仍保持翻转状态。当我单击第一个按钮时,它翻转并且第二个按下的磁贴提供了它不匹配的行为就像没有添加ActionListener的按钮。我想过用PropertyChangeListener解决这个问题,但无法弄清楚如何。

这是我的JPanel中的方法:

@Override
    public void actionPerformed(ActionEvent e){

        Tile tile = (Tile)e.getSource();

        if(tilesFlipped < 2 ){
            tile.flip();
            flippedTiles[tilesFlipped++] = tile;

            if(tilesFlipped == 1){
                return;
            }

            if(flippedTiles[0].equals(flippedTiles[1])){
                tilesFlipped = 0;
                return;

            } else {
                try {
                    Thread.sleep(1000);
                    for(int i = 0; i < 2; i++){
                        flippedTiles[i].flipBack();
                    }
                } catch (InterruptedException e1) {
                }   
            }
            tilesFlipped = 0;
        } 

    }

这是我的Tile课程:

private class Tile extends JButton {
    String photoPath;
    ImageIcon photo;

    Tile(int i){
        photoPath = String.format("/home/stn/Desktop/p/9-%d.jpg", i);
        setPreferredSize(new Dimension(150, 150));
        this.setBackground(Color.cyan);
        this.photo = new ImageIcon(photoPath);
    }

    public void flip(){
        this.setIcon(photo);
        this.setBackground(Color.white);
    }

    public void flipBack(){
        this.setBackground(Color.cyan);
        this.setIcon(null);

    }

    public String getPhotoPath(){
        return photoPath;
    }

    @Override
    public boolean equals(Object o){
        return o instanceof Tile && ((Tile)o).getPhotoPath().equals(photoPath);
    }
    @Override
    public int hashCode(){
        return photoPath.hashCode();
    }

}

1 个答案:

答案 0 :(得分:2)

使用Swing Timer代替Thread.sleep(...)。了解Thread.sleep(...)将当前线程置于休眠状态,此处为Swing 事件调度线程 EDT ,这将使您的整个GUI处于休眠状态,冻结您的应用程序。 Swing Timer可以在不占用EDT的情况下执行一个或重复的操作。例如:

 public void actionPerformed(ActionEvent e) {

    Tile tile = (Tile) e.getSource();

    if (tilesFlipped < 2) {
       tile.flip();
       flippedTiles[tilesFlipped++] = tile;

       if (tilesFlipped == 1) {
          return;
       }

       if (flippedTiles[0].equals(flippedTiles[1])) {
          tilesFlipped = 0;
          return;

       } else {
          Timer timer = new Timer(1000, new ActionListener() {

             @Override
             public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 2; i++) {
                   flippedTiles[i].flipBack();
                }
                tilesFlipped = 0;
             }
          });
          timer.setRepeats(false);
          timer.start();
       }
    }

 }