私は最初の Swing アプリケーションに取り組んでいます。ポーカーカードを使ったメモリーゲームです。
s を使用してカードをシミュレートしJLabel
、表と裏のアイコンを設定します。各カードにはMouseListener
と があり、ユーザーがクリックすると、2 枚のカードが同じかどうかを確認します。それらが同じカードでない場合、これら 2 枚のカードを 1 ~ 2 秒間表示し、この遅延の後、アイコンを元に戻します。
sleep
、wait
、invokeLater
、invokeAndWait
...を使用してみましたが、何も機能しません。
これは私のメインクラスです:
public class Main {
public static void main(String[] args) throws FontFormatException, IOException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
MyApp window = new MyApp();
} catch ( FontFormatException | IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
MyApp
から継承しJFrame
ます。その中で、すべてのカードを 1 つのパネルに追加します。
while ( cont < cardsInGame.size() ){
this.cardsInGame.get(cont).setBounds(x, y, 100, 140);
panelTablero.add(cardsInGame.get(cont));
cardsInGame.get(cont).addMouseListener(this);
x = x+108+5;
if ( (cont+1)%8 == 0 && cont != 0){
y = y+140+15;
x = 53;
}
cont++;
}
そして、これは MouseListener です:
public void mouseClicked(MouseEvent e) {
Card selectedCard = (Card)e.getSource();
if (selectedCard != activeCard){
selectedCard.setIcon(new ImageIcon("img/"+selectedCard.getSuit()+selectedCard.getValue()+".png"));
//JOptionPane.showMessageDialog(vp, "Wait");
if ( activeCard != null && !activeCard.getPaired()) {
int result = activeCard.isPair(selectedCard);
pairsTried++;
if ( result != 0 ){
// PAIR
}
else{
// I WANT TO WAIT HERE
// NO PAIR
selectedCard.setIcon(new ImageIcon(CARD_BACK));
activeCard.setIcon(new ImageIcon(CARD_BACK));
}
activeCard = null;
}
else{
activeCard = selectedCard;
}
}
}
コードに呼び出しを入れるとJOptionPane.showMessageDialog(vp, "Wait")
、すべてうまくいきます。アイコンが更新され、その後、ダイアログの [OK] を待ちます。そうでない場合、アイコンは更新されません (または超高速で表示されません)。
この遅延を追加するにはどうすればよいですか?