删除节点不会在 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
方法:
实例化一个名为 fill
的新 Label
实例
检查所有字段是否填写完整。
当该条件为真时,它执行 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"));
}
}
}
我正在尝试从 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
方法:
实例化一个名为
的新fill
Label
实例检查所有字段是否填写完整。
当该条件为真时,它执行 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")); } } }