2016-12-09 3 views
0

В настоящее время я создал форму с JavaFX. Всегда я нажимаю кнопку, я вызываю метод «addAnswer()». В этом я создаю RadioButton, Label и кнопку удаления, которые я собираю в HBox. Все, что HBoxes я упаковываю в vBox. Проблема теперь в кнопке удаления. Я хочу делить только THAT HBox, в котором нажата кнопка.JavaFX: Получение идентификаторов созданной динамической кнопки

Вот мой код:

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-кнопки имеют одинаковый идентификатор: число, как часто я нажал кнопку надстройки. Есть ли какое-нибудь решение, где я могу просто выбрать тот, который я нажал с помощью этого динамического пути? Потому что я не знаю, как часто кто-то будет нажимать или удалять что-то.

Благодаря

ответ

1

hbox является поле и поэтому всегда HBox последним добавленным используются. (hBox оценивается, когда тело лямбда выполнено, а не во время создания лямбда). Это было бы иначе, если бы вы использовали (эффективно) final локальную переменную:

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

Однако я хотел бы представить другое решение, которое позволило бы использовать один и тот же EventHandler<ActionEvent> для всех удаления Button сек:

Вы можете получить Node, который вызвал событие, используя getSource. Из этого Node вы можете получить родителя, который является HBox. Вы можете удалить это из VBox с помощью remove(Object) method

delAnswer.setOnAction(e -> { 
    // get button 
    Node source = (Node) e.getSource(); 

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

Это то, что я ищу. Большое спасибо! – Lara

0

Я думаю, ваша проблема в том, что вы даете такое же событие всей вашей кнопки, Начните с создания списка, который хранит ваши кнопки, а затем увеличивает значение идентификатора после его воздействия на товар:

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++; 
} 
+0

Спасибо за вашу помощь, но я не хочу добавлять новый список. :) – Lara

Смежные вопросы