【问题标题】:JavaFX - How to assign an Event Handle to an Array of Labels?JavaFX - 如何将事件句柄分配给标签数组?
【发布时间】:2016-02-16 17:37:10
【问题描述】:

我正在使用 Eclipse 和 Java (JavaFX)

我有一个 GridPane 和一个带标签的数组。我为 GridPane 的每一行和每一列添加了一个标签。

GridPane grid = new GridPane();
Label lbs[] = new Label[20*20];

当我将鼠标悬停在标签上时,我希望发生一些事情。假设背景应该改变。

如果我有一个没有数组的标签,它会像这样工作:

lbs.setOnMouseEntered(new EventHandler<MouseEvent>() {
          @Override
          public void handle(MouseEvent e) {
              lbs.setStyle("-fx-background-color:BLACK;");

          }
        });

但由于它是一个标签数组,它用红色强调了上面的整个代码块,并给了我这个错误消息: 无法在数组类型 Label[] 上调用 setOnMouseEntered(new EventHandler(){})

它的唯一工作方式是:

lbs[1].setOnMouseEntered(new EventHandler<MouseEvent>() {
     @Override
     public void handle(MouseEvent e) {
      lbs[1].setStyle("-fx-background-color:BLACK;");

     }
   });

但我不想为所有标签都这样做。我希望应该有一个更简单的方法。

我应该怎么做才能让它工作?我是这个论坛的新手。我的教授向我提出了这个建议,因此我希望我以适当的方式在这里添加代码。

这是我的全部代码:

    package application;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;


public class Main extends Application {
@Override
public void start(Stage primaryStage) {
    try {
        GridPane grid = new GridPane();

         Scene scene = new Scene(grid, (20 * 20), (20 * 20));
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();    
        Label lbs[] = new Label[20*20];


        grid.setGridLinesVisible(true);

         for (int i = 0; i < lbs.length; i++) {
                lbs[i]=new Label();
         }

         int count = 0;
         for (int x = 0; x < lbs.length/20; x++){
                for (int y = 0; y < lbs.length/20; y++){
                    grid.add(lbs[count], x, y);
                    count++;
                }
            }

for(int i = 0; i < 20; i++) {
ColumnConstraints column = new ColumnConstraints(20);
grid.getColumnConstraints().add(column);

}

for(int i = 0; i < 20; i++) {
RowConstraints row = new RowConstraints(20);
grid.getRowConstraints().add(row);
}

    } catch(Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
}

}

这是我的 CSS 文件,以防万一它对解决这个问题有重要帮助:

GridPane {
    -fx-background-color: white ;


    -fx-grid-lines-visible: true;
    -fx-border-color: black 
}

    Label {
          -fx-pref-height: 20;
              -fx-pref-width: 20;
        -fx-background-color: green ;
        -fx-font-size: 11pt;
        -fx-font-family: "Segoe UI Semibold";
        -fx-text-fill: Black;
        -fx-opacity: 0.6;

    }

【问题讨论】:

    标签: java arrays events javafx label


    【解决方案1】:

    创建时只需在每个标签上设置处理程序:

     for (int i = 0; i < lbs.length; i++) {
            Label label = new Label();
            label.setOnMouseEntered(e -> label.setStyle("-fx-background-color:BLACK;"));
            lbs[i]=label;
     }
    

    如果你最终得到更复杂的东西,将标签的创建重构为一个单独的方法可能会有所帮助;

    for (int i = 0 ; i < lbs.length; i++) {
        lbs[i] = createLabel(i);
    }
    

    private Label createLabel(int index) {
        Label label = new Label();
        label.setOnMouseEntered(e -> {
            label.setStyle("-fx-background-color: black;");
            // other things you need to do when the mouse hovers....
        });
        // other label configuration...
        return label ;
    }
    

    【讨论】:

    • 非常感谢。它有帮助。但这是否意味着我必须在这个 For 循环中编写所有代码?我即将编写一个像扫雷这样的游戏。所以会有一些编码等。如果我把所有的代码都放在这个 For Loop 块中可以吗?或者有其他方法吗?
    • 我不知道你这个问题是什么意思。您对数组的每个元素都使用 for 循环。
    • 我的错。这个问题确实不够清楚。但现在我知道如何使用这段代码了,多亏了你和 Arsenicum。
    • 很抱歉打断你。我只是有另一个问题。当我将鼠标悬停在数组的标签上时,我如何知道该数组的标签具有哪个索引?
    • 索引为i。所以你可以在处理程序中执行int index = i; 并访问index
    【解决方案2】:

    不是将事件句柄分配给标签数组,而是分配给该数组中的每个标签。数组不是 GUI 元素,因此您不能悬停它。

    for (int i = 0; i < lbs.length; i++) {
        Label label = new Label();
        label.setOnMouseEntered(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                label.setStyle("-fx-background-color:BLACK;");
            }
        });
        lbs[i] = label;
    }
    

    【讨论】:

    • 非常感谢。现在我更容易理解了:)
    猜你喜欢
    • 2021-11-17
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2022-11-16
    相关资源
    最近更新 更多