javafx将按钮添加到网格窗格

我正在动态添加按钮到网格窗格,但在给它们function后,它们都显示相同的function,我不知道为什么?

import java.awt.Panel; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; public class TestController implements Initializable { @FXML Panel mpanel; @FXML GridPane gpnael; int x=0,y=0,i=0,y1=0; /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { // TODO } @FXML private void add(ActionEvent event) { y1++; Button temp = new Button("Button " + i); temp.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { System.out.println("button"+y1); } }); gpnael.add(temp,i++,1); } } 

现在我在网格窗格中添加了三个按钮,当我点击它们显示相同输出的每个按钮时。

我希望他们都分配不同的输出。

您没有在按钮中定义它,您总是使用非final int来表达您应该尝试使用唯一值创建的值,或者为每个按钮设置id并从id获取值:

 import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; import javafx.stage.Stage; public class ButtonsOnGPanel extends Application { private int i = 0; private GridPane gpnael = new GridPane(); @Override public void start(Stage stage) throws Exception { Pane root = new Pane(); while(i<3){ addButton(); } root.getChildren().add(gpnael); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } private void addButton() { i++; final Button temp = new Button("Button " + i); final int numButton= i; temp.setId("" + i); temp.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { System.out.println("id(" + temp.getId() + ") = " + numButton); } }); gpnael.add(temp, i, 1); } public static void main(String[] args) { launch(args); } } 

如果你想使用lambda表达式:

  temp.setOnAction((ActionEvent e) -> { System.out.println("id(" + temp.getId() + ") = " + numButton); });