I created a Data Model based on an Email class, which has as parameter an IntegerProperty, four StringProperty and a Date. Now, I'm trying to show in my ListView the ID and the name of the sender and to do this I created this method in the ListController:
public class ListController {
private ListView<Email> listView ;
private DataModel model ;
public void initModel(DataModel model) {
// ensure model is only set once:
if (this.model != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.model = model ;
this.model.loadData(null);
**listView.setItems(model.getEmailList());**
listView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) ->
model.setCurrentEmail(newSelection));
model.currentEmailProperty().addListener((obs, oldPerson, newPerson) -> {
if (newPerson == null) {
listView.getSelectionModel().clearSelection();
} else {
listView.getSelectionModel().select(newPerson);
}
});
listView.setCellFactory(lv -> new ListCell<Email>() {
@Override
public void updateItem(Email person, boolean empty) {
super.updateItem(person, empty);
if (empty) {
setText(null);
} else {
setText(person.getID() + " " + person.getMittente());
}
}
});
}
The problem is that I get a java.lang.NullPointerException when I call this method: listView.setItems(model.getEmailList());
This is my DataModel class:
public class DataModel {
private final ObservableList<Email> emailList = FXCollections.observableArrayList(email ->
new Observable[] {email.IDProperty(), email.MittenteProperty()});
private final ObjectProperty<Email> currentEmail = new SimpleObjectProperty<>(null);
public ObjectProperty<Email> currentEmailProperty() {
return currentEmail ;
}
public final Email getCurrentEmail() {
return currentEmailProperty().get();
}
public final void setCurrentEmail(Email email) {
currentEmailProperty().set(email);
}
public ObservableList<Email> getEmailList() {
return emailList ;
}
public void loadData(File file) {
// mock...
emailList.setAll(
new Email(1, "Smith", "John", "Casa", "BLAAAAAAAAAAAAA", new Date(1997, 3, 2)),
new Email(2, "Isabella", "Johnson","Bua", "BUUUUUUU", new Date(1995, 6, 2)),
new Email(3, "Ethan", "Williams", "Rapporto", "IIIIIIIIII", new Date(2011, 9, 8)),
new Email(4, "Emma", "Jones", "Chiesa", "ALEEEEEEEEEE", new Date(2000, 1, 4)),
new Email(5, "Pippo", "Brown", "Vignetta", "OSAAAAAAAA", new Date(1987, 4, 5))
);
}
public void saveData(File file) { }
}
How can I populate the list as soon as I open the program without doing it in this way? I get the NullPointerExcpetion even if I populate it by calling the loadData method.
EDIT: This is the main class:
public class MailBox extends Application {
@Override
public void start(Stage stage) throws Exception {
BorderPane root = new BorderPane();
FXMLLoader listLoader = new FXMLLoader(getClass().getResource("lista.fxml"));
root.setCenter(listLoader.load());
ListController listController = listLoader.getController();
FXMLLoader textareaLoader = new FXMLLoader(getClass().getResource("textarea.fxml"));
root.setBottom(textareaLoader.load());
TextAreaController textareaController = textareaLoader.getController();
DataModel model = new DataModel();
listController.initModel(model);
textareaController.initModel(model);
Scene scene = new Scene(root, 355, 402);
stage.setScene(scene);
stage.show();
}
EDIT2: And this is the TextAreaController Class:
public class TextAreaController {
private DataModel model;
private TextArea textarea;
public void initModel(DataModel model) {
if (this.model != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.model = model ;
model.loadData(null);// aggiunto per far caricare i dati delle person
model.currentEmailProperty().addListener((obs, oldEmail, newEmail) -> {
if (oldEmail != null) {
String id = "ID: "+Integer.toString(oldEmail.IDProperty().getValue().intValue())+"\n";
textarea.setText(id);
/*firstNameField.textProperty().unbindBidirectional(oldEmail.firstNameProperty());
lastNameField.textProperty().unbindBidirectional(oldEmail.lastNameProperty());
emailField.textProperty().unbindBidirectional(oldEmail.emailProperty());*/
}
if (newEmail == null) {
textarea.setText("");
/*firstNameField.setText("");
lastNameField.setText("");
emailField.setText("");*/
} else {
String id = "ID: "+Integer.toString(newEmail.IDProperty().getValue().intValue())+"\n";
textarea.setText(id);
/*firstNameField.textProperty().bindBidirectional(newEmail.firstNameProperty());
lastNameField.textProperty().bindBidirectional(newEmail.lastNameProperty());
emailField.textProperty().bindBidirectional(newEmail.emailProperty());*/
}
});
}
}