как заставить поток обрабатывать события? - PullRequest
0 голосов
/ 06 ноября 2018

Я сделал игру в бинго с использованием javafx и многопоточности, в которой есть несколько игроков и тележка для каждого игрока, каждый игрок (тележка) обрабатывается отдельной цепочкой, которая строит тележку и добавляет ее в основную сцену. когда игрок нажимает на ярлык в корзине, есть несколько вещей, которые должен сделать поток.

что происходит со мной, так это то, что для каждой корзины есть поток, но когда дело доходит до обработки события мыши, он обрабатывается одним и тем же потоком для всех игроков, что не должно быть таким образом

как я могу решить эту проблему?

вот метод запуска

public void run() { // every thread starts from here
    // TODO Auto-generated method stub

    synchronized (this) {
        for (int k = 0; k < size; k++) {
            for (int j = 0; j < size; j++) {
                int num = Generator.Generate();
                MCart[j][k] = num;
                Label textField = this.AddLabel(num, j, k);

                box.add(textField, j, k);
            }
        }
    }
    System.out.println("thread " + Thread.currentThread().getId());

}

и вот метод, который вызывает mouseEvent

    private synchronized Label AddLabel(int num, int j, int k) {

    Label textField = new Label("" + num);
    textField.setAlignment(Pos.CENTER);
    textField.setPrefSize(25, 10);
    textField.setStyle(
            "-fx-pref-width: 2em; -fx-background-color: white; -fx-text-color: black; -fx-border-color:black ;");
    int col = k, Row = j;

    box.setAlignment(Pos.CENTER);
    // box.setStyle(" -fx-background-color: skyblue;");
    // box.setPrefSize(230, 150);
    GridPane.setConstraints(textField, j, k);
    textField.setOnMouseClicked(e -> handleMouseClick(textField, col, Row));
    return textField;
}

а вот метод, который обрабатывает событие мыши

private synchronized void handleMouseClick(Label textField, int col, int Row) {

    long id = Thread.currentThread().getId();
    textField.setStyle("-fx-text-color: red;");

    Label text = textField;
    text.setTextFill(Paint.valueOf("#ff0000"));
    System.out.println("thread " + Thread.currentThread().getId() + " " + id);

}

а вот и вывод thread 20 thread 21 thread 22 thread 23 thread 24 thread 16 16 thread 16 16 thread 16 16

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