我正在尝试创建自己的简单内存游戏,并且我有一个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();
}
}
答案 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();
}
}
}