J'ai une liste à l'intérieur de laquelle j'affiche un élément de type Card.Après la fermeture de l'application, je veux extraire ces objets de la carte et les enregistrer dans un fichier .txt. Cependant, il semble que la liste testingList et ListPropeprty listProperty sont vides et c'est, d'après ce que je comprends, la raison pour laquelle je reçois une exception NullPointerException. J'ai essayé de trouver toute cette erreur, mais je suis accablé. moi:Erreur Enregistrement et chargement d'éléments à partir d'un ListView dans javaFX 8
Voici mon Card.java:
package com.spdesigns.dokkancardspreview.model;
import javafx.scene.image.Image;
public class Card {
private String mName;
private String mDescription;
private Image mMainImage;
private Image mSecondaryImage;
private String mMainImagePath;
private String mSecondaryImagePath;
public Card(String name, String description, Image mainImage, Image secondaryImage) {
mName = name;
mDescription = description;
mMainImage = mainImage;
mSecondaryImage = secondaryImage;
}
public Card(String name, String description , String mainImagePath, String secondaryImagePath) {
new Card(name,description,new Image(mainImagePath),new Image(secondaryImagePath));
}
@Override
public String toString() {
return mName + " | " + mDescription;
}
public Image getmMainImage() {
return mMainImage;
}
public Image getmSecondaryImage() {
return mSecondaryImage;
}
public String getName() {
return mName;
}
public String getDescription() {
return mDescription;
}
}
Voici mon home.java (contrôleur):
package com.spdesigns.dokkancardspreview.controllers;
import com.spdesigns.dokkancardspreview.model.Card;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.io.*;
import java.util.List;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
public class home implements Initializable {
private Card hit = new Card("Hit","Expanding Possibility",
new Image("/images/hit_main.jpg") , new Image("/images/hit_secondary.jpg"));
private boolean clickedAgain = false;
@FXML
private Button arrowButton;
@FXML
private ImageView imageView;
@FXML
private ImageView arrow;
@FXML
private ListView listView;
protected List<Card> testingList = new ArrayList<Card>();
protected ListProperty<Card> listProperty = new SimpleListProperty<Card>();
@Override
public void initialize(URL location, ResourceBundle resources) {
addCard(hit);
//testingList.add("test2");
listView.itemsProperty().bind(listProperty);
// wrapping our list in an observable list and then pass that observableList to the ListProperty isntance
listProperty.set(FXCollections.observableArrayList(testingList));
// Handle listView selection changes
listView.getSelectionModel().selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
System.out.println("ListView item clicked!");
imageView.setImage(new Image(hit.getmMainImage().impl_getUrl()));
arrow.setVisible(true);
arrowButton.setVisible(true);
}));
arrow.translateYProperty().set(283f);
arrowButton.translateYProperty().set(283f);
arrow.setRotate(180);
arrow.setVisible(false);
arrowButton.setVisible(false);
}
public void handleShowDetails(ActionEvent actionEvent) {
System.out.println("Button Clicked!");
if(clickedAgain) {
imageView.setImage(new Image(hit.getmMainImage().impl_getUrl()));
arrow.setRotate(180);
clickedAgain = false;
} else {
imageView.setImage(new Image(hit.getmSecondaryImage().impl_getUrl()));
arrow.setRotate(360);
clickedAgain = true;
}
}
// Saving
public void exportTo(String fileName) {
try(
FileOutputStream fos = new FileOutputStream(fileName);
PrintWriter writer = new PrintWriter(fos);
){
for(Card card : testingList) {
writer.printf("%s|%s|%s|%s/n",card.getName(),card.getDescription(),
card.getmMainImage().impl_getUrl(),card.getmSecondaryImage().impl_getUrl());
}
} catch (IOException ioe) { // If the file couldn't be opened
System.out.printf("Problem saving: %s/n", fileName);
ioe.printStackTrace();
}
}
// Loading
public void importFrom(String fileName) {
try(
FileInputStream fis = new FileInputStream(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
){
String line;
while((line = reader.readLine()) != null) {
String[] args = line.split("\\|");
this.addCard(new Card(args[0],args[1],args[2],args[3]));
}
} catch (IOException ioe) {
System.out.printf("Problem loading: %S/n" , fileName);
ioe.printStackTrace();
}
System.out.printf("%s loaded",testingList.get(0).toString());
}
public void addCard(Card card) {
testingList.add(card);
}
public void printTestingList() {
for (Card card : testingList) {
System.out.println(card.toString());
}
}
}
Mon Main.java:
package com.spdesigns.dokkancardspreview;
import com.spdesigns.dokkancardspreview.controllers.home;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.File;
public class Main extends Application {
private home controller;
private File file = new File("CardsCollection.txt");
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("/fxml/home.fxml"));
primaryStage.setTitle("Dokkan Battle Card Preview");
primaryStage.setScene(new Scene(root, 900, 700));
primaryStage.setResizable(false);
// Loading cards
primaryStage.show();
try {
if(!file.exists()) {
file.createNewFile();
}
controller.importFrom("CardsCollection.txt");
} catch (NullPointerException npe) {
System.out.println("Error loading file!");
npe.printStackTrace();
}
}
@Override
public void stop() {
System.out.println("App is closing!");
// Saving before exiting
try {
controller.exportTo("CardsCollection.txt");
} catch (NullPointerException npe) {
System.out.println("Problem saving file!");
npe.printStackTrace();
}
controller.printTestingList();
}
public static void main(String[] args) {
launch(args);
}
}
PS: J'ai aussi essayé d'écrire le fichier manuellement mais n'a pas fonctionné non plus! entrer le code ici