如何使线程处理事件?

时间:2018-11-06 17:17:43

标签: java multithreading javafx

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

0 个答案:

没有答案