删除节点不会在 GridPane 中更新

Removing node does not update in GridPane

我正在尝试从 GridPane 中删除一个节点,但是当我这样做时 gridPane.getChildren().remove(node),它似乎没有在 UI 中更新。我有一个标签,当 TextField 为空时会出现,当它们被填满时,它应该显示 Order added。但是当空的 TextField 标签出现并且我实际填写它们时,请填写所有字段 不会消失并且 添加订单 就在上面。

import java.awt.*;
import java.util.ArrayList;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.event.ActionEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.text.Text;
import javafx.geometry.Pos;
import javafx.scene.control.TextField;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.paint.Color;
import javax.swing.*;

public class InputPane extends HBox
{
    ArrayList < Order > orderList;

    private HandlePane handlePane;

    TextField textField1 = new TextField();
    TextField textField2 = new TextField();
    TextField textField3 = new TextField();

    Label prodName, quantity, price, fill = new Label();

    Button place_an_order;

    GridPane gridPane;
    TextArea textArea;

    public InputPane(ArrayList < Order > list, HandlePane pane)
    {
        this.orderList = list;
        this.handlePane = pane;

        prodName = new Label("Prod. Name");
        quantity = new Label ("Quantity");
        price = new Label ("Price($)");
        prodName.setMinWidth(Region.USE_PREF_SIZE);

        place_an_order = new Button("Place an Order");

        gridPane = new GridPane();
        gridPane.setPadding(new Insets(10,20,10,20));
        gridPane.setVgap(10);
        gridPane.setHgap(10);

        gridPane.add(prodName, 0, 1);
        gridPane.add(textField1, 1,1);
        gridPane.add(quantity, 0,2);
        gridPane.add(textField2, 1,2);
        gridPane.add(price, 0,3);
        gridPane.add(textField3, 1,3);
        gridPane.add(place_an_order, 1,4);

        textArea = new TextArea();
        textArea.setText("No order");
        textArea.setPrefSize(320,120);

        this.getChildren().addAll(gridPane, textArea);

        ButtonHandler handler = new ButtonHandler();
        place_an_order.setOnAction(handler);
    }

    private class ButtonHandler implements EventHandler < ActionEvent >{
        public void handle(ActionEvent e){
            String productStr = textField1.getText().trim();
            String quantityStr = textField2.getText().trim();
            String priceStr = textField3.getText().trim();

            fill.setTextFill(Color.web("FF0000"));
            fill.setMinWidth(Region.USE_PREF_SIZE);

            if (productStr.isEmpty() || quantityStr.isEmpty() || priceStr.isEmpty())
            {
                fill.setText("Please fill all the fields");
                fill.setTextFill(Color.web("FF0000"));
                fill.setMinWidth(Region.USE_PREF_SIZE);
            }else{
                fill.setText("Order added");
                fill.setTextFill(Color.web("#000000"));
                gridPane.add(fill, 0,0);
            }
        }
    }
}

空字段:

有填充字段:

每次点击按钮时,handle 方法:

  1. 实例化一个名为 fill

    的新 Label 实例
  2. 检查所有字段是否填写完整。

当该条件为真时,它执行 gridPane.getChildren().remove(fill);,但是 fill 刚刚在步骤 1 中实例化并且还不是 gridPane 的子级,所以指令 什么都不做.

当指令 gridPane.add(fill, 0,0); 被执行时,您在网格窗格中添加 fill 标签(带有文本“Order added”),您会得到这种 叠加效果 多次执行 handle 时。

这不是 JavaFX 错误; GridPane 的每个单元格都表现在 StackPane 行,因此您可以完美地 在彼此之上添加标签 .


我建议您:

  • 删除gridPane.getChildren().remove(fill);指令

  • gridPane.add(fill, 0, 0);移到handle方法之外;您必须执行此行 一次(在组件初始化时)。

    private class ButtonHandler implements EventHandler <ActionEvent> {
        Label fill;
    
        public ButtonHandler() {
            fill = new Label();
            fill.setTextFill(Color.web("FF0000"));
            fill.setMinWidth(Region.USE_PREF_SIZE);
    
            gridPane.add(fill, 0, 0);
        }
    
        public void handle(ActionEvent e) {
            String productStr = textField1.getText().trim();
            String quantityStr = textField2.getText().trim();
            String priceStr = textField3.getText().trim();
    
            if (productStr.isEmpty() || quantityStr.isEmpty() || priceStr.isEmpty()) {
                fill.setText("Please fill all the fields");
                fill.setTextFill(Color.web("FF0000"));
            } else {
                fill.setText("Order added");
                fill.setTextFill(Color.web("#000000"));
            }
        }
    }