Я сделал игру в бинго с использованием 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