【问题标题】:JAVAFX Determining which label has been clickedJAVAFX 确定点击了哪个标签
【发布时间】:2018-03-05 00:49:09
【问题描述】:

我在这里没有找到解决方案,所以我可以使用,所以我希望这里有人会找时间帮助我。我正在 javafx 中制作我的第一个应用程序,以了解这里的工作原理......并且:

通过 fx:define,我在我的 fxml 文件中定义了一个 labelList,它基本上由所有在游戏中的玩家名称组成。它包含 10 个标签,但如果只有 4 个播放器,则只有 4 个标签设置为可见,这就是为什么在下面的循环中我使用 playerList.size()。

通过点击标签,我希望我的应用能够确定点击了哪个标签。所以我可以获取播放器的 id 以在其他功能中使用它(例如,我选择一个标签,然后单击一个按钮,该按钮将点添加到具有与标签相同 id 的播放器)。

我设法在没有循环的情况下做到了这一点,并且效果很好:

labelList.get(0).setOnMouseClicked(new EventHandler<MouseEvent>() {
              @Override
              public void handle(MouseEvent e) {
                  labelList.get(0).setStyle("-fx-font-weight: bold");
                  setId(0);
              }
            });

但我一直想知道是否可以一次循环执行此操作。从更大的角度来看,如果有更多的标签和其他东西,那么查看单独启动 50 个处理程序的代码看起来真的很可怕。如果我尝试运行此循环,我会收到错误消息“局部变量定义在 封闭范围必须是最终的”

@FXML
private void activatePlayer() {

    for( int id = 0; id < playerList.size(); id++) { 
        labelList.get(id).setOnMouseClicked(new EventHandler<MouseEvent>() {
              @Override
              public void handle(MouseEvent e) {
                  labelList.get(id).setStyle("-fx-font-weight: bold");
                  setId(id);
              }
            });
    }
}

【问题讨论】:

    标签: javafx event-handling label fxml


    【解决方案1】:

    这个网站上回答了好几次,但我的快速搜索找不到相同的答案。

    只需将 id(和标签,如果你喜欢的话)放在一个(有效的)最终变量中:

    for( int id = 0; id < playerList.size(); id++) { 
        Label label = labelList.get(id);
        int currentId = id ;
        label.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                label.setStyle("-fx-font-weight: bold");
                setId(currentId);
            }
        });
    }
    

    【讨论】:

    • 感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多