NullPointerException observableList

derpropeller

Mitglied
Hallo Leute,

ich weiß nicht ob ich gerade einfach auf dem Schlauch stehe, aber ich verstehe nicht ganz, warum ich an der Stelle, wenn ich die observableList in die FilteredList stecken will, eine NullPointerException bekomme:
Java:
FilteredList<Personen> personenListeFilter = new FilteredList<>(launcher.getPersonenListe(), p -> true);
Die Personen werden schließlich im Konstruktor des Launcher der observableList hinzugefügt?!

Wäre schön, wenn mir jemand weiter helfen könnte. 🙂

Java:
package icontact;

import java.io.IOException;

import icontact.model.Personen;
import icontact.view.contactuicontroller;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Launcher extends Application {

    private Stage primaryStage;
    private BorderPane wrapper;
    private ObservableList<Personen> personenListe = FXCollections.observableArrayList();

    //Konstruktor
    public Launcher(){
        personenListe.add(new Personen("Waldemar","Metzler"));
        personenListe.add(new Personen("Dave","Daveler"));
        personenListe.add(new Personen("Dave2","Davveler"));
        personenListe.add(new Personen("Blabla","Kacke"));
        personenListe.add(new Personen("Stinkt","Heftig"));
        personenListe.add(new Personen("Dolly","Buster"));
        personenListe.add(new Personen("Eric","Buster"));
    }

    public ObservableList<Personen> getPersonenListe(){
        return personenListe;
    }


    //Start-Methode der Application Klasse
    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("iContact");

        initwrapper();
        initcontactui();
    }


    //Initialisiert den umschließenden Container
    public void initwrapper(){

        //Wie eigentlich immer, wenn man was aus einer Datei lädt,
        //exception handling nötig
        try {

            //Lädt die Inhalte aus der wrapper.fxml
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(Launcher.class.getResource("view/wrapper.fxml"));
            wrapper = (BorderPane) loader.load();

            //Fügt der primaryStage (der Hauptcontainer) die Scene
            //hinzu
            Scene scene = new Scene(wrapper);
            primaryStage.setScene(scene);
            primaryStage.show();

        }catch (IOException e){
            e.printStackTrace();
        }

    }

    //Initialisiert das Layout
    public void initcontactui(){
        try {

            //Lädt Inhalte aus contactui.fxml
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(Launcher.class.getResource("view/contactui.fxml"));
            AnchorPane contactui = (AnchorPane) loader.load();

            //Jetzt, das Layout in die Mitte des umschließenden (wrapper) Containers setzen
            wrapper.setCenter(contactui);

            //Verbindet launcher und controller
            contactuicontroller controller = loader.getController();
            controller.setLauncher(this);

        }catch (IOException e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }



}
Java:
package icontact.model;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Personen {

    //Variablen

    private final StringProperty vname;
    private final StringProperty nname;
    private final StringProperty adresse;
    private final IntegerProperty fnummer;
    private final IntegerProperty mnummer;
    private final StringProperty mail;


    //Konstruktor
    public Personen(String vname, String nname){
        this.vname = new SimpleStringProperty(vname);
        this.nname = new SimpleStringProperty(nname);

        this.adresse = new SimpleStringProperty("blabalweg");
        this.fnummer = new SimpleIntegerProperty(123456);
        this.mnummer = new SimpleIntegerProperty(789012);
        this.mail = new SimpleStringProperty("super@klasse.de");

    }

    //Getters und setters

    public String getVname() {
        return vname.get();
    }

    public void setVname(String vname){
        this.vname.set(vname);
    }

    public StringProperty vnameProperty(){
        return vname;
    }


    public String getNname() {
        return nname.get();
    }

    public void setNname(String nname){
        this.nname.set(nname);
    }

    public StringProperty nnameProperty(){
        return nname;
    }

    public String getAdresse() {
        return adresse.get();
    }

    public void setAdresse(String adresse){
        this.adresse.set(adresse);
    }

    public StringProperty adresseProperty(){
        return adresse;
    }

    public int getFnummer() {
        return fnummer.get();
    }

    public void setFnummer(int fnummer){
        this.fnummer.set(fnummer);
    }

    public IntegerProperty fnummerProperty(){
        return fnummer;
    }

    public int getMnummer() {
        return mnummer.get();
    }

    public void setMnummer(int mnummer){
        this.mnummer.set(mnummer);
    }

    public IntegerProperty mnummerProperty(){
        return mnummer;
    }

    public String getMail() {
        return mail.get();
    }

    public void setMail(String mail){
        this.mail.set(mail);
    }

    public StringProperty mailProperty(){
        return mail;
    }

}
Java:
package icontact.view;

import icontact.Launcher;
import icontact.model.Personen;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;

public class contactuicontroller {

    //Variablen
    //Damit FXML zugriff auf private Variablen hat, muss @FXML vorangestellt werden

    @FXML
    private TableView<Personen> tabelle;
    @FXML
    private TableColumn<Personen, String> cvname;
    @FXML
    private TableColumn<Personen, String> cnname;
    @FXML
    private TableColumn<Personen, String> cadresse;
    @FXML
    private TableColumn<Personen, Integer> cfnummer;
    @FXML
    private TableColumn<Personen, Integer> cmnummer;
    @FXML
    private TableColumn<Personen, String> cmail;
    @FXML
    private TextField filter;

    private Launcher launcher;

    public contactuicontroller(){

    }

    @FXML
    private void initialize(){

        //Spalten anlegen, beim einbinden über FXML muss diese Methode immer "initialize" heißen
        cvname.setCellValueFactory(cellData -> cellData.getValue().vnameProperty());
        cnname.setCellValueFactory(cellData -> cellData.getValue().nnameProperty());
        cadresse.setCellValueFactory(cellData -> cellData.getValue().adresseProperty());
        cfnummer.setCellValueFactory(cellData -> cellData.getValue().fnummerProperty().asObject());
        cmnummer.setCellValueFactory(cellData -> cellData.getValue().mnummerProperty().asObject());
        cmail.setCellValueFactory(cellData -> cellData.getValue().mailProperty());

        //Filtern
        //ObservableList in FilteredList packen
        FilteredList<Personen> personenListeFilter = new FilteredList<>(launcher.getPersonenListe(), p -> true);

        filter.textProperty().addListener((observable, oldValue, newValue) -> {
            personenListeFilter.setPredicate(personen -> {
                if(newValue == null || newValue.isEmpty()) {
                    return true;
                }
                String lowerCaseFilter = newValue.toLowerCase();

                if(personen.getVname().toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                } else if(personen.getNname().toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                }
                return false;
            });
        });

        //FilteredList in sortierte Liste
        SortedList<Personen> personenListeSortiert = new SortedList<>(personenListeFilter);

        personenListeSortiert.comparatorProperty().bind(tabelle.comparatorProperty());

        tabelle.setItems(personenListeSortiert);
    }

    public void setLauncher(Launcher launcher){
        this.launcher = launcher;

    }

}
 
Ich hab es leider doch noch nicht hinbekommen.
Ich bekomme immernoch die NullPointerException wenn ich die observableList aus dem Launcher in die FilteredList in der contactcontrollerui einpacken möchte.
 
Okay jetzt hab ich es aber hinbekommen 😀

Ich hab den Teil aus dem controller der für das Filtern der tableView zuständig ist, aus der initialize methode rausgenommen und in die set Methode gepackt, die auf die Hauptklasse referenziert:


Code:
public void setLauncher(Launcher launcher){
        this.launcher = launcher;

        ObservableList<Personen> test = FXCollections.observableArrayList();

        test = launcher.getPersonen();

        FilteredList<Personen> personenListeFilter = new FilteredList<Personen>(test, p -> true);

        filter.textProperty().addListener((observable, oldValue, newValue) -> {
            personenListeFilter.setPredicate(personen -> {
                if(newValue == null || newValue.isEmpty()) {
                    return true;
                }
                String lowerCaseFilter = newValue.toLowerCase();

                if(personen.getVname().toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                } else if(personen.getNname().toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                }
                return false;
            });
        });

        //FilteredList in sortierte Liste
        personenListeSortiert = new SortedList<>(personenListeFilter);

        personenListeSortiert.comparatorProperty().bind(tabelle.comparatorProperty());

        tabelle.setItems(personenListeSortiert);
        //tabelle.setItems(launcher.getPersonen());

    }
 

Neue Themen


Zurück
Oben