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:
Die Personen werden schließlich im Konstruktor des Launcher der observableList hinzugefügt?!
Wäre schön, wenn mir jemand weiter helfen könnte.
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);
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;
}
}