JavaFX:获取Dynamic创建的Button的ID

时间:2016-12-09 21:14:09

标签: java button dynamic javafx

我目前使用JavaFX制作了一个表格。 总是我按下一个按钮,我称之为“addAnswer()” - 方法。 在那里我创建了一个RadioButton,一个Label和一个删除按钮,我将它捆绑在一个HBox中。所有HBox都包装在一个vBox中。 问题现在是删除按钮。我想只删除点击按钮所在的HBox。

这是我的代码:

public void addAnswer() {
    this.rB = new RadioButton();
    checkAnswer.getToggles().add(rB);
    hBox = new HBox();
    tF = new TextField();
    delAnswer = new Button("Löschen");
    delAnswer.setId(Integer.toString(counter));
    hBox.getChildren().addAll(rB, tF, delAnswer);
    hBox.setId(Integer.toString(counter));
    delAnswer.setOnAction(e -> delAnswer(Integer.parseInt(hBox.getId())));
    System.out.println(delAnswer.getId());

    vBox.getChildren().addAll(hBox);
    counter++;
}   

public void delAnswer(int e){  
    vBox.getChildren().remove(delAnswer.getId());

}

我尝试过上面这个,但我意识到,所有的delAnswers-Buttons都有相同的ID:我按下add-Button的次数。 有没有解决方案,我可以选择那个用动态方式按下的那个?因为我不知道有人会经常按或删除某些内容。

谢谢

2 个答案:

答案 0 :(得分:1)

hbox是一个字段,这就是为什么始终使用最后添加的HBox。 (hBox在执行lambda主体时进行评估,而不是在创建lambda时进行评估。如果您使用(有效)final局部变量:

,则会有所不同
final HBox hBoxLocal = hBox;
delAnswer.setOnAction(e -> delAnswer(Integer.parseInt(hBoxLocal.getId())));

但是,我想提供一个不同的解决方案,允许您对所有删除EventHandler<ActionEvent>使用相同的Button

您可以使用Node获取触发事件的getSource。从这个Node,您可以获得父HBox。您可以使用remove(Object) method

VBox中删除此内容
delAnswer.setOnAction(e -> {
    // get button
    Node source = (Node) e.getSource();

    // remove parent of button from VBox
    vBox.getChildren().remove(source.getParent());
});

答案 1 :(得分:0)

我认为您的问题是您为所有按钮提供相同的事件,首先创建一个存储按钮的列表,然后在将ID影响到项目后增加ID的值:

List<Button> buttons = new ArrayList<>();
/*
  Create Button and call IDEvt method to create new event
  for each button

*/
private void IDEvt(Button btn){

    btn.setId(String.valueOf(IDRank)); 

    btn.setOnMousePressed(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {

            System.out.println(btn.getId());

        }
    });

    IDRank++;
 }