2016-12-09 30 views
0

私は現在JavaFXでフォームを作成しています。 私は常にボタンを押します。私は "addAnswer()"メソッドを呼び出します。 私は、RadioButton、Label、およびDelete Buttonを作成します。これはHBoxにバンドルされています。すべてのHBoxesはvBoxにパックされています。 今問題は削除ボタンです。私はクリックされたボタンがあるところのHBOXだけをデリートしたい。ここでJavaFX:動的作成ボタンのIDを取得する

が私のコードです:私は、アドオンのボタンを押し頻度の数:

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を持っていることを、私は上記の、このいずれかを試してみましたが、私は気づきました。 私はちょうど私がその動的な方法で押されたものを選ぶことができるソリューションはありますか?私は誰かが何度も何かを押したり削除したりすることを知らないからです。

おかげ

答えて

1

hboxはフィールドであり、最後の追加HBoxが使用されている理由を、常にこれがあります。 (hBoxはラムダボディの実行時に評価され、ラムダ作成時では評価されません)。私はあなたがすべて削除Button秒間同じEventHandler<ActionEvent>を使用することができるようになる別の解決策を提示したいと思いますしかし

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

あなたは(事実上) finalローカル変数を使用する場合、これは、異なるだろう

getSourceを使用してイベントをトリガーしたNodeを取得できます。このNodeから親を得ることができます。これはHBoxです。あなたは、ボタンを格納し、その後、IDの値をインクリメントリストを作成することから始めます、私はあなたの問題はすべてのあなたのボタンに同じイベントを与えることだと思います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

を使用してVBoxからこれを削除することができますアイテムに影響を与えた後:

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

関連する問題