【问题标题】:JavaFX: Getting IDs of Dynamic created ButtonJavaFX:获取动态创建按钮的 ID
【发布时间】:2016-12-09 21:14:08
【问题描述】:

我目前使用 JavaFX 制作了一个表单。 我总是按一个按钮,我调用“addAnswer()”-方法。 在那里我创建了一个 RadioButton、一个标签和一个删除按钮,我将它们捆绑在一个 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 按钮都有相同的 ID:我按下添加按钮的频率。 有没有什么解决方案可以让我选择我用那种动态方式按下的那个?因为我不知道人们多久会按下或删除一些东西。

谢谢

【问题讨论】:

    标签: java button dynamic javafx


    【解决方案1】:

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

    final HBox hBoxLocal = hBox;
    delAnswer.setOnAction(e -> delAnswer(Integer.parseInt(hBoxLocal.getId())));
    

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

    您可以使用getSource 获取触发事件的Node。从这个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());
    });
    

    【讨论】:

    • 这就是我要找的。非常感谢!
    【解决方案2】:

    我认为您的问题是您为所有按钮提供相同的事件,首先创建一个存储您的按钮的列表,然后在将 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++;
     }
    

    【讨论】:

    • 感谢您的帮助,但我不想添加新列表。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多