tableview не будет обновляться автоматически при добавлении нового элемента - PullRequest
0 голосов
/ 07 марта 2020

Когда создается новое объявление, просмотр таблицы не refre sh, почему?

Вот мой код, он работает, когда я использую tabelview.refre sh (), но я не думаю, что это лучшее решение. Я думал, что с использованием ObservableList, таблица будет обновляться при изменении списка.

package GUI;

import java.io.IOException;
import java.time.LocalDate;

import domein.Aankondiging;
import domein.DomeinController;
import domein.Sessie;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;

public class BeherenAankondigingenSchermController extends VBox {
    @FXML
    private Label infoLabel;
    @FXML
    private TableView<Aankondiging> tableviewSessie;
    @FXML
    private TableColumn<Aankondiging, String> publicatiedatumTableColumn;
    @FXML
    private TableColumn<Aankondiging, String> publicistTableColumn;
    @FXML
    private TableColumn<Aankondiging, String> inhoudTableColumn;
    @FXML
    private Button nieuweAankondigingPlaatsenButton;
    @FXML
    private Label tekstAankondigingLabel;
    @FXML
    private TextArea tekstAankondigingTextArea;
    @FXML
    private Label foutmeldingLabel;
    @FXML
    private Button aankondigingPlaatsenButton;

    private DomeinController dc;
    private Sessie sessie;

    private ObservableList<Aankondiging> aankondigingen;

    public BeherenAankondigingenSchermController(DomeinController dc, Sessie sessie) {
        this.dc = dc;
        this.sessie = sessie;
        //this.aankondigingen = FXCollections.observableList(sessie.getAankondigingLijst());

        FXMLLoader loader = new FXMLLoader(getClass().getResource("BeherenAankondigingenScherm.fxml"));
        loader.setRoot(this);
        loader.setController(this);
        try {
            loader.load();
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
        build();
    }

    private void build() {
        infoLabel.setText("Aankondigingen voor de sessie " + sessie.getNaamSessie());
        foutmeldingLabel.setText("");

        // items om nieuwe aankondigen te plaatsen onzichtbaar maken
        tekstAankondigingLabel.setVisible(false);
        tekstAankondigingTextArea.setVisible(false);
        aankondigingPlaatsenButton.setVisible(false);
        foutmeldingLabel.setVisible(false);

        // Juiste gegevens toevoegen aan het scherm
        tableviewSessie.setItems(dc.geefAankondigingenVanSessie(sessie));
        //dc.geefAankondigingenVanSessie(sessie)

        // altijd met properties werken!!!!!!!!!!!
        // properties aan de kolommen koppelen
        publicatiedatumTableColumn
                .setCellValueFactory(cellData -> cellData.getValue().publicatieDatumAankondigingProperty());

        publicistTableColumn.setCellValueFactory(cellData -> cellData.getValue().publicistProperty());

        inhoudTableColumn.setCellValueFactory(cellData -> cellData.getValue().InhoudAankondigingProperty());
    }

    @FXML
    void nieuweAankondigingPlaatsenButtonClicked(ActionEvent event) {
        tekstAankondigingLabel.setVisible(true);
        tekstAankondigingTextArea.setVisible(true);
        aankondigingPlaatsenButton.setVisible(true);
        foutmeldingLabel.setVisible(true);
    }

    //aankondiging wordt toevoegd maar is nog niet zichtbaar in tableview
    @FXML
    void aankondigingPlaatsenButtonClicked(ActionEvent event) {
        try {
            dc.plaatsAankondiging(LocalDate.now(), dc.getAangemeldeGebruiker().getNaam(), tekstAankondigingTextArea.getText(), sessie);
            tekstAankondigingLabel.setVisible(false);
            tekstAankondigingTextArea.setVisible(false);
            aankondigingPlaatsenButton.setVisible(false);
            foutmeldingLabel.setVisible(false);
            tekstAankondigingTextArea.setText("");
            foutmeldingLabel.setText("");

            //voorlopige oplossing (wss is dit niet de beste...)
            tableviewSessie.refresh();

        } catch (IllegalArgumentException e) {
            foutmeldingLabel.setText(e.getMessage());
        }
    }

}
public ObservableList<Aankondiging> geefAankondigingenVanSessie(Sessie sessie) {
        return FXCollections.observableList(kalender.geefAankondigingLijst(sessie));
    }
public ObservableList<Aankondiging> geefAankondigingLijst(Sessie sessie) {
        return FXCollections.observableList(sessie.getAankondigingLijst());
    }
@Override
    public ObservableList<Aankondiging> getAankondigingLijst() {
        return FXCollections.observableList(aankondigingLijst);
    }

Все эти элементы сохраняются в базе данных, мой проект к большому, чтобы вставить весь код здесь. Может кто-нибудь решить проблему?

1 Ответ

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

FXCollections.observableList создает ObservableList, который использует List, переданный в качестве параметра для хранения информации. Это не означает, что список поддержки каким-то образом получает возможность автоматически уведомлять список обновлений. Фактически вы не получите никаких событий, если только вы не измените содержимое списка поддержки с помощью ObservableList.

того факта, что вы не сохраняете ни один из списков, кроме aankondigingLijst (и список, используемый как items (который никогда не извлекается для модификации) таким образом, который позволяет получить доступ позже для внесения изменений, указывает, что вы никогда не обновляете какой-либо список, кроме aankondigingLijst, который не приводит к запуску обновлений для любого из 3 ObservableList s, которые рекурсивно обертывают aankondigingLijst.

Единственный способ получить обновления в представленном сценарии - это сделать aankondigingLijst ObservableList самой и никогда не создавать ObservableList перенос списка в вызовы методов, используемых для получения списка, используемого как items:

public ObservableList<Aankondiging> geefAankondigingenVanSessie(Sessie sessie) {
    return kalender.geefAankondigingLijst(sessie);
}
public ObservableList<Aankondiging> geefAankondigingLijst(Sessie sessie) {
    return sessie.getAankondigingLijst();
}
private final ObservableList<Aankondiging> aankondigingLijst = ...; 

@Override
public ObservableList<Aankondiging> getAankondigingLijst() {
    return aankondigingLijst;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...