Reputation: 1549
I'm developing a checkers game in Java, and I stumbled on a problem. What I'm trying to create is that when a checkerpiece is pressed, the available 2 spots in front of it should turn into grey for 2 seconds.
Turn into grey is easy, but when I want it to turn back after 2 seconds using Thread.sleep(2000), I noticed that it first does the rest of the case in this switch before actually sleeping (so it turns the fresh grey squares back to black immediately)
What went wrong? Thanks in advance!
switch (bord[ypos][xpos]) {
case 0:
break;
case 1:
break;
case 2:
if (bord[ypos + 1][xpos - 1] == 1) {
bord[ypos + 1][xpos - 1] = 4;
}
if (bord[ypos + 1][xpos + 1] == 1) {
bord[ypos + 1][xpos + 1] = 4;
}
repaint();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
if (bord[ypos + 1][xpos - 1] == 4) {
bord[ypos + 1][xpos - 1] = 1;
}
if (bord[ypos + 1][xpos + 1] == 4) {
bord[ypos + 1][xpos + 1] = 1;
}
break;
case 3:
break;
}
Trying it out with timers(I'm new to these so please don't facepalm too hard)
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package dammen;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
*
* @author Boyen
*/
public class Board extends JPanel implements MouseListener {
boolean test;
boolean black = false;
boolean redpiece = false;
boolean bluepiece = true;
Timer timer;
private int[][] bord = {{0, 2, 0, 2, 0, 2, 0, 2},
{2, 0, 2, 0, 2, 0, 2, 0},
{0, 2, 0, 2, 0, 2, 0, 2},
{1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1},
{3, 0, 3, 0, 3, 0, 3, 0},
{0, 3, 0, 3, 0, 3, 0, 3},
{3, 0, 3, 0, 3, 0, 3, 0}};
public Board(Dammen parent) {
addMouseListener(this);
timer = new Timer(100,taskPerformer);
timer.setRepeats(false);
}
public void start() {
}
public void paint(Graphics g) {
super.paint(g);
Dimension size = getSize();
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
switch (bord[i][j]) {
case 0:
g.setColor(Color.WHITE);
break;
case 1:
g.setColor(Color.BLACK);
break;
case 2:
g.setColor(Color.RED);
break;
case 3:
g.setColor(Color.BLUE);
break;
case 4:
g.setColor(Color.gray);
break;
}
g.fillRect((size.width / 8) * j, (size.height / 8) * i, size.width / 8, size.height / 8);
}
}
}
int mouseX, mouseY;
@Override
public void mouseClicked(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
zoekmogelijkespots(mouseX, mouseY);
}
ActionListener taskPerformer = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
};
public void zoekmogelijkespots(int mouseX, int mouseY) {
Dimension size = getSize();
System.out.println(mouseX + "," + mouseY);
int xpos;
int ypos;
xpos = (int) (mouseX / (size.width / 8));
ypos = (int) (mouseY / (size.height / 8));
System.out.println(ypos + "," + xpos);
System.out.println(bord[ypos][xpos]);
switch (bord[ypos][xpos]) {
case 0:
break;
case 1:
break;
case 2:
if (bord[ypos + 1][xpos - 1] == 1) {
bord[ypos + 1][xpos - 1] = 4;
}
if (bord[ypos + 1][xpos + 1] == 1) {
bord[ypos + 1][xpos + 1] = 4;
}
repaint();
timer.start();
if (bord[ypos + 1][xpos - 1] == 4) {
bord[ypos + 1][xpos - 1] = 1;
}
if (bord[ypos + 1][xpos + 1] == 4) {
bord[ypos + 1][xpos + 1] = 1;
}
break;
case 3:
break;
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
Upvotes: 1
Views: 176
Reputation: 347334
You could use a Swing javax.swing.Timer to achieve what you want...
if (bord[ypos + 1][xpos - 1] == 1) {
bord[ypos + 1][xpos - 1] = 4;
}
if (bord[ypos + 1][xpos + 1] == 1) {
bord[ypos + 1][xpos + 1] = 4;
}
repaint();
Timer timer = new Timer(2000, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (bord[ypos + 1][xpos - 1] == 4) {
bord[ypos + 1][xpos - 1] = 1;
}
if (bord[ypos + 1][xpos + 1] == 4) {
bord[ypos + 1][xpos + 1] = 1;
}
}
});
timer.setRepeats(false);
timer.start();
Upvotes: 3
Reputation: 32343
Instead of Thread.sleep(2000);
, you could do this (note, I have no way to test this):
public static class GrayWorker extends SwingWorker<Object, Object> {
private final int xpos;
private final int ypos;
private final int[][] bord;
public GrayWorker(int[][] bord, int xpos, int ypos) {
this.bord = bord; this.xpos = xpos; this.ypos = ypos;
}
@Override
public Object doInBackground() {
Thread.sleep(2000);
return null;
}
@Override
protected void done() {
if (bord[ypos + 1][xpos - 1] == 4) {
bord[ypos + 1][xpos - 1] = 1;
}
if (bord[ypos + 1][xpos + 1] == 4) {
bord[ypos + 1][xpos + 1] = 1;
}
}
}
Then, in your other class, do:
GrayWorker worker = new GrayWorker(bord, xpos, ypos);
worker.execute();
Upvotes: 1