2017-09-18 7 views
0

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

Répondre

0

Donner un bon coup d'oeil Je crois que le problème est que le contrôleur «d'origine» (dont le nom devrait commencer par une majuscule) est nul. Pour accéder à votre contrôleur, vous devez faire quelque chose comme ceci:

FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/fxml/home.fxml")); 

Parent root = loader.load(); 
controller = loader.getController();