Удалить кнопку, нажав на нее в JavaFX

Я создаю приложение каландра/планировщика с использованием JavaFX. Приложение состоит из одной GridPane с 35 (7x5) VBox. Внутри этих VBox есть TaskButtons (реализовано ниже). Когда я щелкаю правой кнопкой мыши TaskBox, текст становится серым, а когда я щелкаю левой кнопкой мыши TsskButton, я хочу, чтобы он удалил кнопку. Вещи, которые я уже знаю.

  1. AnchorPaneNode (расширяет VBox) не имеет статического метода getChildren().
  2. Я не могу создать отдельную переменную экземпляра для панели, так как не знаю, сколько их у меня будет.
  3. getParent().getChildren() не работает, потому что родительский метод getChildren() не виден.
  4. VBox имеет публичный getChildren(), но он не статичен.
  5. Я попытался сделать статический метод доступа к getChildren(), но не смог.

Что еще я могу попытаться удалить эту кнопку при щелчке правой кнопкой мыши? Спасибо за помощь!

public class TaskButton extends Button {

    protected int buttonNum = AnchorPaneNode.listIndex;
    public TaskButton(String str)
    {
        super(str);

        setStyle("-fx-background-color: transparent;");


        setOnMouseClicked(e -> {
            if(e.getButton() == MouseButton.SECONDARY) 
            {
                //I want to remove this button from the VBox, neither of these work
                AnchorPaneNode.getChildren().remove(this);
                //or
                getParent().getChildren().remove(this);
            }
            else if(e.getButton() == MouseButton.PRIMARY) 
            {
                setStyle("-fx-background-color: transparent; -fx-text-fill: #666666;");
            }           
        });
    }
}

person Legomanalec    schedule 07.04.2020    source источник
comment
Я думаю, это будет полезно. stackoverflow.com/questions/29722232/   -  person Kumar Anil Chaurasiya    schedule 07.04.2020
comment
@KumarAnilChaurasiya Я уже видел эту тему, и, к сожалению, она не помогла. Это решение имело установленную переменную экземпляра для VBox, которую я хотел бы избежать любой ценой, поскольку в моем приложении, скорее всего, будут сотни, если не тысячи VBox. Спасибо за ваше предложение!   -  person Legomanalec    schedule 07.04.2020


Ответы (1)


Нашла ответ на свой вопрос! Для тех, кто сталкивается с той же проблемой, это то, что я сделал для ее решения:

setOnMouseClicked(e -> {
    if (e.getButton() == MouseButton.SECONDARY) {
        //I want to remove this button from the VBox, neither of these work
        //AnchorPaneNode.getChildren().remove(this);
        //or
        VBox vbox = (VBox) getParent();
        vbox.getChildren().remove(this);
    } else if (e.getButton() == MouseButton.PRIMARY) {
        setStyle("-fx-background-color: transparent; -fx-text-fill: #666666;");
    }           
});

Мне нужно было получить доступ к общедоступному getChildren(), который предоставляет VBox, и я сделал это, приведя (this)getParent() к VBox. Оттуда я смог получитьChildren() и удалить «это».

person Legomanalec    schedule 07.04.2020