当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中从流窗格中删除节点?

冯宪
2023-03-14

我创建了一个由HBox、按钮和标签组成的数组。每次按下“添加”按钮,我都会设置:

hbox[count] = new HBox();
buttons[count] = new Button();
labels[count] = new Label();

/**
 * FXML Controller class
 *
 * @author HeshamSaleh
 */
public class SecondaryViewController implements Initializable {

@FXML
private TextField searchBar;
@FXML
private Button addBtn;
@FXML
private FlowPane flowPane;

ArrayList<String> addedArtists = new ArrayList<String>();
String[] artists = {"Craig David", "Coldplay", "Eminem", "D12", "Shakira", "Radiohead", "Linkin Park", "Maroon 5", "Celine Dion", "50 Cent", "Tupac", "Snoop Dogg", "Metallica", "Backstreet Boys"};
List<String> artistNames  = new ArrayList<String>(Arrays.asList(artists));
int count = 4;
HBox[] hboxArr = new HBox[5];
Button[] buttonArr = new Button[5];
Label[] labelArr = new Label[5];
int hboxCount = 0;
/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
    searchBar.setFocusTraversable (false);
    TextFields.bindAutoCompletion(searchBar, artistNames);
}   

@FXML
private void addBtnPressed(MouseEvent event) {
    String artistName = searchBar.getText();
    searchBar.setText("");

    if(artistNames.contains(artistName) && !addedArtists.contains(artistName) && count != -1) {

        hboxArr[hboxCount] = new HBox();
        buttonArr[hboxCount] = new Button();
        labelArr[hboxCount] = new Label();
        hboxArr[hboxCount].setAlignment(Pos.CENTER);
        hboxArr[hboxCount].setSpacing(-1);
        buttonArr[hboxCount].setText("X");
        buttonArr[hboxCount].setAlignment(Pos.CENTER);
        buttonArr[hboxCount].setStyle("-fx-background-color: TRANSPARENT; -fx-border-color: #000000;");
        buttonArr[hboxCount].setFont(Font.font("Open Sans", FontWeight.BOLD, 12));
        buttonArr[hboxCount].setMinWidth(20);
        buttonArr[hboxCount].setMinHeight(20);
        labelArr[hboxCount].setText(artistName.toUpperCase());
        labelArr[hboxCount].setFont(Font.font("Proxima Nova Rg", 12));
        labelArr[hboxCount].setAlignment(Pos.CENTER);
        labelArr[hboxCount].setStyle("-fx-background-color: TRANSPARENT; -fx-border-color: #000000;");
        labelArr[hboxCount].setMinWidth(90);
        labelArr[hboxCount].setMinHeight(27);

        hboxArr[hboxCount].getChildren().addAll(buttonArr[hboxCount], labelArr[hboxCount]);
        flowPane.setAlignment(Pos.CENTER);
        flowPane.getChildren().add(hboxArr[hboxCount]);
        addedArtists.add(artistName);
        count--;
        hboxCount++;
    }

}
}

共有1个答案

申昌勋
2023-03-14

这里有一个例子...您可以将实现的思想应用到您的程序中:

import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class Example extends Application{

    ArrayList<Node> components = new ArrayList<Node>(); // arraylist to contain all components


    @Override
    public void start(Stage ps) throws Exception {
        FlowPane root = new FlowPane();

        for (int i=0; i<5; i++){

            HBox hb = new HBox();
            // set hb attributes

            Button b = new Button("Button" + i);
            // set b attributes

            // then add action listener
            b.setOnAction(e->{ 
                root.getChildren().remove(hb); // remove by Object reference
            });

            Label l = new Label("Label" + i);
            // set l attributes

            hb.getChildren().addAll(b,l);
            components.add(hb);
        }

        root.getChildren().addAll(components);

        Scene s = new Scene(root, 600,400);
        ps.setScene(s);

        ps.show();

    }

    public static void main(String[] args){
        launch(args);
    }

}

更新:

在您提供了代码之后,您所需要做的就是将此添加到您的代码中:

buttonArr[hboxCount].setOnAction(e->{ // add listener to your button at every index in your array of buttons
    flowPane.getChildren().remove(hboxArr[hboxCount]); // and when that button is pressed, remove the HBox at the same index in the array of HBoxs from the flowPane (that works as I said -> removing by Object Reference)
});
 类似资料:
  • 我用的是sceneBuilder。 如何清除锚泊烷 有没有办法删除AnchorPane中包含的所有节点(已经从sceneBuilder创建并填充了按钮和形状)?

  • 我正在做一个小的JavaFX项目。在我的一个场景中,我想动态地添加和移除我实现的自定义组件,它分别从TitledPane扩展到Accordion。这一切都很好,但从手风琴上移除窗格后,这该死的东西不会立即调整大小,但只有在我单击gui上的某个位置后。我准备了下面这张GIF,把问题可视化给你看。 有人能告诉我为什么手风琴只有在我点击gui界面上的某个地方后才会调整大小,而不是立即调整大小吗?我的意思

  • 我是javafx新手,正在尝试在textflow中显示大量文本。它显示得很好,但我就是不知道如何删除文本。 所以我要做的是像这样从textFlow中删除所有文本节点 但当我这样做并向textFlow添加一些内容时,它会显示在已经显示的文本之后。我想删除那里的文本,并显示从文本流开始添加的文本。 我想我必须以某种方式重新呈现textflow的视图,但我不知道怎么做。那么如何删除所有内容并重新添加文本

  • 问题内容: 我正在使用SceneBuilder 8.0.0和JavaFX8。 我有和附加到。 当应用程序启动,并连接到。 如何删除这些节点之一? (我只知道clear()方法,该方法将从中删除所有节点)。谢谢。 问题答案: 在JavaFX中,可以使用以下命令简单地从父节点(例如AnchorPane)中删除节点 参考 所以,如果你有一个直接引用这些节点,你可以使用下面的代码删除来自: 抬头 如果由于

  • 我有两个ObservableList,其中一个包含一些歌曲,另一个包含与歌曲相关的目录。 我希望当从它的ObservableList中删除一个目录时,所有包含该目录的歌曲都从它们的ObservableList中删除。但是当我这样做的时候,只有带奇数id的歌曲被移除,带偶数id的仍然存在!!! 我的ObservableLists在另一个类中,“Controller”是包含ObservableList

  • 我有一个单链表。如果我想从这个链表中删除一个已知的元素,我能做什么? 例如:节点*头;(44)节点*尾部;(39) 链接列表:44 27 59 13 45 39我们想从中删除45。得到:4427591339 我只知道从列表中删除第一个元素(如果元素(需要删除)是列表的第一个元素)。我得到了:头=头- 如何从列表中删除中间节点?