У меня есть 4 класса: класс сервера для пользователя 1, класс клиента для пользователя 2,
Класс GridPane для настройки платы, класс ImageView для отслеживания каждого ImageView в сетке.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь создать анимацию для отбрасываемых фигур, анимация появляется только в окне, которое щелкнул пользователь, до тех пор, пока анимация не будет завершена, она будет размещена в нижней части столбца панель других пользователей.
// -------- Проблема возникает внизу в методе Установить ИВ -------------
public class ConnectFour extends GridPane
{
private final int BOARD_SIZEX = 7;
private final int BOARD_SIZEY = 6;
private ImageView[][] aIVs ;
private Image obImgRed;
private Image obImgYellow;
private Image obCurrent;
private boolean bMyTurn;
private BiFunction<Integer, Integer, Integer> func;
public ConnectFour(BiFunction<Integer, Integer, Integer> obFunc)
{
super();
func = obFunc;
this.setStyle(" -fx-background-color: lightgray; -fx-vgap: 4; -fx-hgap:4; -fx-grid-lines-visible: true");
establishIVs();
this.setAlignment(Pos.CENTER);
//Place the elements onto a GridView to work with
for (int i=0; i<BOARD_SIZEX; i++)
{
for (int j=0; j<BOARD_SIZEY; j++)
{
this.add(aIVs[i][j], i, j);
}
}
}
public void setFirstTurn(boolean bVal)
{
setTurn(bVal);
//Additionally we want to set the Current Image we are playing with
//This method will be called on start up.
if(bVal)
{
this.obCurrent = this.obImgRed;
Platform.runLater(() -> this.setStyle("-fx-background-color: green; -fx-vgap: 4; -fx-hgap:4; -fx-grid-lines-visible: true"));
}
else
{
this.obCurrent = this.obImgYellow;
Platform.runLater(() -> this.setStyle("-fx-background-color: blue; -fx-vgap: 4; -fx-hgap:4; -fx-grid-lines-visible: true"));
}
}
public void setTurn(boolean bVal)
{
this.bMyTurn = bVal;
if(bVal)
{
Platform.runLater(() -> this.setStyle("-fx-background-color: green; -fx-vgap: 4; -fx-hgap:4; -fx-grid-lines-visible: true"));
}
else
{
Platform.runLater(() -> this.setStyle("-fx-background-color: blue; -fx-vgap: 4; -fx-hgap:4; -fx-grid-lines-visible: true"));
}
}
public void setOpponentPiece(int nRow, int nCol)
{
Image obImg = obCurrent.equals(obImgYellow)? obImgRed : obImgYellow;
this.aIVs[nRow][nCol].setImage(obImg);
}
public void setPiece(int nRow, int nCol)
{
this.aIVs[nRow][nCol].setImage(this.obCurrent);
}
private void animate(int nCol, Image obEmpty)
{
int nRow = 0;
boolean ColNotFull = false;
while(this.aIVs[nCol][nRow].getImage().equals(obEmpty) && this.bMyTurn && nRow < 5)
{
System.out.printf("start of while(animate) loop\n");
try
{
ColNotFull = true;
aIVs[nCol][nRow].setImage(obCurrent);
System.out.println("Start of sleep\n");
Thread.sleep(1000);
System.out.println("end of sleep\n");
nRow++;
if(this.aIVs[nCol][nRow].getImage().equals(obEmpty) && this.bMyTurn)
{
System.out.printf("current space finish and next space clear\n");
aIVs[nCol][nRow-1].setImage(obEmpty);
if(nRow == 5)
{
aIVs[nCol][nRow].setImage(obCurrent);
}
}
}
catch(InterruptedException exp)
{
}
}
if(ColNotFull){
System.out.println("animation finished\n");
this.func.apply(nCol, nRow);
setTurn(ColNotFull);
}
}
// -------------------- это где проблема возникает ------------------ -
private void establishIVs()
{
//Set the images
this.obImgRed = new Image("file:images/Connect4/Circle-red.png");
this.obImgYellow = new Image("file:images/Connect4/Circle-yellow.png");
Image obEmpty = new Image("file:images/Empty.png");
this.obCurrent = obImgRed;
this.aIVs = new ImageView[BOARD_SIZEX][BOARD_SIZEY];
for (int i=0; i < BOARD_SIZEX; i++)
{
int nCol = i;
for (int j=0; j < BOARD_SIZEY; j++)
{
Connect4IV obIV = new Connect4IV(obEmpty, j, i, 90);
obIV.getView().setOnMouseClicked( e -> {
Thread obThread = new Thread(() -> {
System.out.printf("clicked\n");
animate(nCol, obEmpty);
});
obThread.setDaemon(true);
obThread.start();
});
this.aIVs[i][j] = obIV.getView();
}
}
}
}