从控制器类外部调用的gridpane.getchildren()。add()会阻止程序

时间:2019-05-18 11:03:45

标签: javafx

我正在制作传统的日本棋盘游戏(类似于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
    }

1 个答案:

答案 0 :(得分:0)

我通过使用Platform.runLater()解决了这个问题。由于GUI只能在应用程序线程中操作,所以出现了问题。