如何获取HBox中被点击按钮的节点索引?
获取JavaFX HBox中点击按钮的对应节点索引
我尝试在HBox中添加按钮,希望在按钮被点击时获取其对应的节点索引,以下是我的实现代码:
HBox gp = new HBox(10); gp.setPadding(new Insets(3)); for (int i = 0; i < 20; i++) { JFXButton jb = new JFXButton("Number " + i); jb.setStyle("-fx-background-color: rgb(230, 126, 34)"); jb.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("index no?"); } }); jb.setMinWidth(100); jb.setMinHeight(50); gp.getChildren().add(jb); } gp.prefWidthProperty().bind(topscroll.widthProperty()); topscroll.setContent(gp); gp.prefWidthProperty().bind(topscroll.widthProperty()); topscroll.setContent(gp);请问有什么实现该需求的建议?
这里有几个实用的方案帮你实现需求,你可以根据自己的场景选择:
方法1:用Effectively Final变量直接传递索引(最简便)
在循环里把当前的索引i存成一个effectively final的临时变量,这样lambda表达式就能安全访问它(Java 8及以上版本支持):
for (int i = 0; i < 20; i++) { final int currentIndex = i; // 保存当前索引为可被lambda访问的变量 JFXButton jb = new JFXButton("Number " + i); jb.setStyle("-fx-background-color: rgb(230, 126, 34)"); // 用lambda简化事件处理,直接拿到currentIndex jb.setOnAction(event -> System.out.println("点击的索引是:" + currentIndex)); jb.setMinWidth(100); jb.setMinHeight(50); gp.getChildren().add(jb); }
这种写法简洁直观,适合按钮位置不会变动的场景。
方法2:给按钮绑定UserData存储索引
如果需要保留最初的索引值(哪怕按钮后续在HBox中的位置被调整),可以把索引存在按钮的userData属性里:
for (int i = 0; i < 20; i++) { JFXButton jb = new JFXButton("Number " + i); jb.setStyle("-fx-background-color: rgb(230, 126, 34)"); jb.setUserData(i); // 将索引存入按钮的自定义数据中 jb.setOnAction(event -> { JFXButton clickedBtn = (JFXButton) event.getSource(); int index = (int) clickedBtn.getUserData(); System.out.println("点击的索引是:" + index); }); jb.setMinWidth(100); jb.setMinHeight(50); gp.getChildren().add(jb); }
这种方法的优势是索引和按钮本身绑定,不受后续节点顺序变化影响。
方法3:实时获取按钮在HBox中的当前索引
如果需要的是按钮在HBox中的实时位置索引(比如后续会添加/删除其他节点,或者调整按钮顺序),可以直接通过HBox的子节点列表查找:
for (int i = 0; i < 20; i++) { JFXButton jb = new JFXButton("Number " + i); jb.setStyle("-fx-background-color: rgb(230, 126, 34)"); jb.setOnAction(event -> { JFXButton clickedBtn = (JFXButton) event.getSource(); int currentIndex = gp.getChildren().indexOf(clickedBtn); System.out.println("点击的当前索引是:" + currentIndex); }); jb.setMinWidth(100); jb.setMinHeight(50); gp.getChildren().add(jb); }
注意:如果HBox的子节点有变动,这个方法返回的索引会同步更新,适合需要实时位置的场景。
内容的提问来源于stack exchange,提问作者Uthpala Bandara
相关产品推荐
相关产品推荐

