如何将多个文本字段添加到arraylist JavaFX

时间:2017-09-22 17:14:41

标签: java user-interface arraylist javafx

我试图创建一个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();
    }
}

}

1 个答案:

答案 0 :(得分:1)

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

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

删除以下行:

@FXML
private TextField field;

将方法主体更改为:

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

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