You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:45:03