gridpane.getchildren (). add () вызывается извне класса контроллера, блокирует программу - PullRequest
0 голосов
/ 18 мая 2019

Я делаю традиционную японскую настольную игру (которая похожа на Go).Я хочу поместить изображение в квадрат GridPane (15 * 15), вызвав метод в классе контроллера вне класса.Однако программа контроллера блокируется при выполнении "gomokuBoard.getChildren (). Add (imageview);"в противник_put_stone () метод.Что я должен сделать, чтобы поместить объект управления извне программы контроллера?

Вот что я уже сделал.Я закомментировал строку кода и выполнил программу.Это привело к успеху, за исключением того, что камни противников не появлялись на экране GUI.

Вот часть класса контроллера.Строка, которую я упомянул, является последней строкой метода "oppident_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 голосов
/ 20 мая 2019

Я решил эту проблему с помощью Platform.runLater (). Поскольку GUI может работать только в потоке приложения, возникла проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...