我有以下的JavaFX应用程序.我希望每次我单击该按钮时,都会增加count个,并且该按钮被替换为一个显示新计数的新实例.但是,"上一步"按钮仍然可见.为什么打pane.getChildren().removeAll()好像不管用?

public class App extends Application {
  public static void main(String[] args) {
    launch();
  }

  private int count;

  public void start(Stage stage) {
    count = 0;

    var root = new VBox();
    var button = createButton(root);
    root.getChildren().add(button);

    var scene = new Scene(root, 640, 480);
    stage.setScene(scene);
    stage.show();
  }

  private void onButtonClicked(final Pane root) {
    count += 1;
    
    root.getChildren().removeAll(); // <-- This doesn't work?
    root.getChildren().add(createButton(root));
  }

  private Button createButton(final Pane root) {
    var button = new Button("Clicked " + count + " times");
    button.setOnAction((_event) -> onButtonClicked(root));
  }
}

推荐答案

removeAll()并不能证明子元素们是清白的.相反,它预计会收到特定Node个实例的参数列表,然后删除这些特定的子级,而保持所有其他子实例不变.按照规范,不带参数地调用它并不会删除任何内容!Here are the relevant docs.

你是在找clear()吗?该函数从子对象ObservableList中移除所有元素.(Relevant docs.)你会想要做这样的改变:

private void onButtonClicked(final Pane root) {
  count += 1;
    
  root.getChildren().clear(); // This does the trick!
  root.getChildren().add(createButton(root));
}

Java相关问答推荐

Java在模块化jar文件中找不到类,但是javap可以

Java中不同包中的类之间的配置共享

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

Java中如何根据Font.canDisplay方法对字符串进行分段

Chunk(Int)已弃用并标记为要删除

JPanel透支重叠的JComcoBox

PDFBox未加载内容

如何对多个字段进行分组和排序?

如何使用Jackson将XML元素与值和属性一起封装

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

如何集成语义发布和BitBucket(Java项目)

如何在代码中将行呈现在矩形前面?

如何在不删除Java中已有内容的情况下覆盖文件内容?

try 使用Spring集成和MySQL实现发件箱模式时,锁定等待超时

在打开搜索结果时,如何让Eclipse打开整个文件?

没有Tomcat,IntelliJ如何在本地运行API?

为什么我的登录终结点不能被任何请求访问?

HBox内部的左对齐按钮(如果重要的话,在页码内)

在数组中查找素数时出现逻辑错误

在JSON上获取反斜杠