【问题标题】:How to add multiple textfields to an arraylist JavaFX如何将多个文本字段添加到数组列表 JavaFX
【发布时间】:2017-09-22 17:14:41
【问题描述】:

我正在尝试制作一个 UI,它可以从通过按下按钮添加的文本字段中获取数字,添加数字,然后打印控制台。我已经想出了如何以无限数量添加文本字段,但我似乎无法从每个文本字段中获取所有数字并打印出总和。每当我将数字放入我的文本字段并按下“添加数字”按钮时,它只会返回最新添加的文本字段中的数字。这是我的代码:

public VBox pane;
@FXML
private Button addButton;

@FXML
private TextField field;

@FXML
private void addNewTextField(ActionEvent event) {
    field = new TextField();

    field.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            if (!newValue.matches("\\d*")) {
                field.setText(newValue.replaceAll("[^\\d]", ""));
            }
        }
    });

    pane.getChildren().add(field);

}

@FXML
private void addNumbers(ActionEvent e) {

    ArrayList<Integer> numList = new ArrayList<>();

    try {
        ArrayList<Integer> list = new ArrayList<>();

        int result = Integer.parseInt(field.getText());

        list.add(result);



        int sum = 0;
        for (int i : list) {
            sum += result;
            System.out.println("The sum of numbers is  = " + sum);
        }

    } catch (NumberFormatException exception) {
        exception.printStackTrace();
    }
}

}

【问题讨论】:

  • field 设为局部变量,而不是实例字段。
  • 如果您的PaneTextFields 中只有TextFields,那么您需要使用Pane 来检索TextFields。在您的 addNumber(..) 方法中使用 pane.getChildren()

标签: java user-interface arraylist javafx


【解决方案1】:

在这种情况下,该字段根本不应该是实例变量,因此不应将其注释为@FXML,而应在您的方法中声明。

如果您不知道局部变量是什么以及它与实例变量有何不同,请阅读此tutorial on local variables

删除这些行:

@FXML
private TextField field;

将方法体改为:

private void addNewTextField(ActionEvent event) {
    TextField field = new TextField();
    . . .
}

除此之外:您永远不应该将注释为 @FXML 的变量设置为新值(引用将由 FXMLLoader 注入,并且不应由应用程序程序员重新分配)。

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多