我目前使用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的次数。 有没有解决方案,我可以选择那个用动态方式按下的那个?因为我不知道有人会经常按或删除某些内容。
谢谢
答案 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++;
}