Не можете добавить значения в arraylist? - PullRequest
0 голосов
/ 06 марта 2020

Почему arrayList печатает 2 раза в этом коде контроллера javafx?

Пример 1:

List<Compute> list = new ArrayList<>(); // declared as global

@FXML
public void clickSubmit() {

    int hr = Integer.parseInt(txtHours.getText());
    int min = Integer.parseInt(txtminutes.getText());
    Compute compute = new Compute(hr, min);
    list.add(compute);
    for(int x = 0; x < list.size(); x++) {
        showVBox.getChildren().add(new Label(list.get(x).toString()));
        list = new ArrayList<>(copyList);
    }

У меня есть 2 значения в этом списке. При втором представлении было также показано первое значение

Так что я создал еще один ArrayList и взял копию origList. При этом это не будет печатать 2 раза при втором представлении.

List<Compute> copyList = new ArrayList<>(); // declared as global

@FXML
public void clickSubmit() {
    List<Compute> origList = new ArrayList<>();
    int hr = Integer.parseInt(txtHours.getText());
    int min = Integer.parseInt(txtminutes.getText());
    Compute compute = new Compute(hr, min);
    origList.add(compute);

    for (int x = 0; x < origList.size(); x++) {
        showVBox.getChildren().add(new Label(origList.get(x).toString()));
        copyList = new ArrayList<>(origList); // I took it's copy
    }
}

введите описание изображения здесь

Однако, я все еще не понимаю, почему это так печать 2 раза на моем примере 1. Кроме того, время не будет добавлено должным образом, если я использовал пример 2. Пожалуйста, помогите!

@FXML
public void clickAdd() {
Duration sum = Duration.ZERO;
for(Compute duration : list) {
sum = sum.plus(duration.getDuration());
}
System.out.println(sum);
System.out.format("%d:%02d", sum.toHours(), sum.toMinutesPart());
}

1 Ответ

1 голос
/ 06 марта 2020

Обратите внимание, что у вас есть значение для l oop в методе clickSubmit, поэтому каждый раз, когда нажимается кнопка отправки, весь список будет проходить по циклу, и каждый элемент будет добавляться в VBox.

При первом нажатии clickSubmit в списке будет только один элемент, поэтому одна метка будет добавлена ​​в VBox. При втором щелчке по списку будет два элемента, поэтому в VBox будут добавлены две метки more , первая из которых будет добавлена ​​в первый раз.

См. проблема? Содержимое VBox не очищается автоматически в начале clickSubmit, что вы могли предположить.

Одно из решений - добавить только одну метку каждый раз, только для нового элемента:

public void clickSubmit() {

    int hr = Integer.parseInt(txtHours.getText());
    int min = Integer.parseInt(txtminutes.getText());
    Compute compute = new Compute(hr, min);
    list.add(compute);
    showVBox.getChildren().add(new Label(compute.toString()));
}

В качестве альтернативы clear VBox перед добавлением всех меток:

public void clickSubmit() {
    // note this line:
    showVBox.getChildren().clear();
    int hr = Integer.parseInt(txtHours.getText());
    int min = Integer.parseInt(txtminutes.getText());
    Compute compute = new Compute(hr, min);
    list.add(compute);
    for(int x = 0; x < list.size(); x++) {
        showVBox.getChildren().add(new Label(list.get(x).toString()));
        list = new ArrayList<>(copyList);
    }
}

Ваш пример 2 «работает», потому что вы очищаете список (да, это то, что origList= new ArrayList<>(copyList); делает) каждый раз, поэтому список почти всегда пуст.

...