我正在制作传统的日本棋盘游戏(类似于Go)。我想做的是通过从类外部调用控制器类中的方法,将图像放在GridPane(15 * 15)的正方形中。但是,执行“ gomokuBoard.getChildren()。add(imageview);”时,控制器程序将阻塞。在akery_put_stone()方法中。为了从控制器程序外部放置控制对象,该怎么办?
以下是我已经完成的工作。 我注释掉了代码行并执行了程序。除了对手的石头没有出现在GUI屏幕上之外,它都取得了成功。
这是控制器类的一部分。我提到的行是“ opponent_put_stone”方法的最后一行。
//this method is called by pushing a button in GridPane. this method works.
@FXML private GridPane gomokuBoard;
@FXML private Button hint_button;
@FXML private Label messagefromServer;
@FXML private static Button[][] put_stone_button;
private EventHandler<MouseEvent> mouseClick;
private Image black_stone;
private Image white_stone;
private static int mycolor = 1;
private GomokuGame game;
public void put_mystone(MouseEvent event) {
int x = GridPane.getRowIndex((Node) event.getSource());
int y = GridPane.getColumnIndex((Node) event.getSource());
put_stone_button[x][y].setDisable(true);
game.gomoku.putStone(x, y, mycolor);
GomokuGame.go_signal();
ImageView imageview;
if(mycolor == 1) {
imageview = new ImageView(black_stone);
}
else {
imageview = new ImageView(white_stone);
}
GridPane.setConstraints(imageview, y, x);
gomokuBoard.getChildren().add(imageview);
game.x = x;
game.y = y;
}
//this method is called from outside the controller program.
public void opponent_put_stone(int x, int y) {
put_stone_button[x][y].setDisable(true);
game.gomoku.putStone(x, y, 3-mycolor);
ImageView imageview;
if(mycolor == 1) {
imageview = new ImageView(white_stone);
}
else {
imageview = new ImageView(black_stone);
}
GridPane.setConstraints(imageview, y, x);
gomokuBoard.getChildren().add(imageview); //this line blocks program
}
答案 0 :(得分:0)
我通过使用Platform.runLater()解决了这个问题。由于GUI只能在应用程序线程中操作,所以出现了问题。