JavaFX - 如何将事件句柄分配给标签数组?
JavaFX - How to assign an Event Handle to an Array of Labels?
我正在使用 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;
}
不将事件句柄分配给标签数组,而是分配给该数组中的每个标签。数组不是 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;
}
只需在创建标签时在每个标签上设置处理程序即可:
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 ;
}
我正在使用 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;
}
不将事件句柄分配给标签数组,而是分配给该数组中的每个标签。数组不是 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;
}
只需在创建标签时在每个标签上设置处理程序即可:
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 ;
}