JAVAFX确定单击了哪个标签

时间:2018-03-04 16:43:25

标签: javafx event-handling label fxml

我没有在这里找到解决方案我可以使用所以我希望有人在这里找一分钟来帮助我。我正在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);
              }
            });
    }
}

1 个答案:

答案 0 :(得分:0)

本网站已多次回答,但我的快速搜索无法找到相应的答案。

只需将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);
        }
    });
}