やはり新たにスレッドを作ったりする必要があったんですね。
とりあえずカード移動部分をそのまま抜き出してエンクロージング型クラスを作り、waitではなくThread.sleepを使い、下のコードで私の思っているような動作になりました。
トランプは実はpaintによる描画ではなく、クリック判定を楽する目的で画像を入れたJLabelにしています。
CardクラスというのがJLabelを親クラスとした自作クラスになっていて、トランプの数字記憶用変数numとマーク記憶用変数markとトランプをめくるcardTurnメソッドなどがあります。
列や場にあるトランプの並びを記憶させたりするためのAreaクラスがあり、ベースの枠を表示させるためにもJLabelを親クラスとして作っていて、その上に重なっているトランプの並びを記憶するためのVector<Card>のcard変数などがあります。
line配列やarea配列はそのクラスのもので、line配列で各列・area配列で各場にあるトランプを管理しています。
gameClearメソッドでクリア判定をし、true(クリア)なら以降の動作はやるだけ無駄なのでreturnしていましたが、Threadのrunメソッドの場合returnはするべきではなかったりしますか?
//-----------------------------
@Override
public void mouseClicked(MouseEvent event){
if(!(event.getSource() instanceof Card)){
new CardMove().start();
}
}
class CardMove extends Thread{
@Override
public void run(){
try {
while(true){
int move=0;
for(int x=0;x<7;x++){
if(line[x].card.size()>0){
for(int x2=0;x2<4;x2++){
if(area[x2].card.size()==0){
if(line[x].card.get(0).num==0){
Thread.sleep(500);
getContentPane().setComponentZOrder(line[x].card.get(0), 0);
line[x].card.get(0).setLocation(area[x2].getLocation());
area[x2].card.add(line[x].card.get(0));
line[x].card.remove(0);
move++;
if(gameClear()==true){
return;
}
break;
}
}
else{
if((line[x].card.get(0).mark==area[x2].card.get(area[x2].card.size()-1).mark) &&
(line[x].card.get(0).num==area[x2].card.get(area[x2].card.size()-1).num+1)){
Thread.sleep(500);
getContentPane().setComponentZOrder(line[x].card.get(0), 0);
line[x].card.get(0).setLocation(area[x2].getLocation());
area[x2].card.add(line[x].card.get(0));
line[x].card.remove(0);
move++;
if(gameClear()==true){
return;
}
break;
}
}
}
if(line[x].card.size()>0 && line[x].card.get(0).turn==0){
Thread.sleep(500);
line[x].card.get(0).cardTurn();
}
}
}
if(move==0){
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}