我使用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