【问题标题】:JAVAFX:OnAction event with parametersJAVAFX:带参数的OnAction事件
【发布时间】:2018-08-16 15:47:47
【问题描述】:

我正在用 javaFX 制作一个简单的国际象棋游戏。 我使用 fxml 文件创建了我的棋盘,并在每个单元格内使用了一个带有按钮的 gridPane。 当用户按下按钮时,我想获取按下按钮的列和行索引。 有没有办法做到这一点? 我正在考虑使用这样的功能,但它不起作用。

private void buttonClicked(MouseEvent event) {                
  Button btn = (Button) event.getSource();
  String nome = btn.getId();
  Alert alert = new Alert(AlertType.INFORMATION);
  alert.setTitle(nome);
  alert.setHeaderText(null);
  alert.setContentText(nome);
  alert.showAndWait();
}

我也做了同样的功能,试图打印父母的 id,但仍然无法正常工作。在 fxml 文件中,对该函数的调用如下:

<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
  <children>
    <Button layoutX="14.0" layoutY="19.0" mnemonicParsing="false" onAction="#buttonClicked" prefHeight="63.0" prefWidth="94.0" styleClass="blackButton" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  </children>
</AnchorPane>

【问题讨论】:

  • 您不能使用将MouseEvent 作为EventHandler&lt;ActionEvent&gt; 参数的方法。参数类型必须是与EventHandler 类型参数或超类型相同类型的Event

标签: java oop button javafx


【解决方案1】:

您不能将参数传递给按钮单击处理程序。

但您可以使用以下方法检索行/列坐标:

AnchorPane cellAnchorPane = (AnchorPane) btn.getParent();
int row = GridPane.getRowIndex(cellAnchorPane);
int col = GridPane.getColumnIndex(cellAnchorPane);

顺便说一句,我不知道您要实现什么,但我认为按钮不需要位于 AnchorPane 内。而且用fxml而不是代码创建棋盘真的会很重复

看看这个示例应用。您可以创建一个处理程序并传递这些参数

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        GridPane gridpane = new GridPane();
        Scene scene = new Scene(gridpane, 400, 400);

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            Button b = new Button("cell " + i + " - " + j);
            final int col = i;
            final int row = j;
            b.setOnAction(a -> buttonClicked(col, row));
            gridpane.add(new AnchorPane(b), i, j);
        }

    }

    primaryStage.setScene(scene);
    primaryStage.show();



}

    private void buttonClicked(int col, int row) {
        System.out.println("button : " + col + " -" + row + " pressed");

    }

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

【讨论】:

  • 答案已更新:通过代码,一个简单的 for 循环就足够了,您可以传递所需的所有参数。
  • 为什么要将按钮添加到anchorPane而不是直接将其插入gridPane?
  • 是的,这也是我在回答中提到的一点,我尝试重现 fxml 中的内容
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多