2017-09-20 10 views
0

Je souhaite pouvoir enregistrer mes objets Carte dans le fichier "CardsColleciton.txt" (soit en tapant dessus, soit en les codant en dur) puis charger ces objets dans ma liste testingList afin que je puisse les afficher correctement. Cependant, j'ai essayé une tonne de choses mais je n'arrive pas à comprendre pourquoi les deux problèmes suivants se produisent:L'enregistrement et l'importation à partir d'un fichier .txt provoquent l'écrasement des données

1) Chaque fois J'écris dans le fichier .txt soit en codant en dur ou en tapant dedans, mon code les charge très bien mais après la fermeture du programme, les données sont supprimées et je dois recommencer. 2) Si je code dur les objets, ils apparaissent dans ma liste mais quand j'écris normalement dans le fichier .txt, le code dit qu'ils ont été chargés (et ils étaient, la taille de la liste de test augmente) mais ne les affiche pas sur le listView.

J'espère que quelqu'un ici peut m'aider à comprendre ces deux-là. PS: J'ai lu beaucoup d'autres articles similaires sur le 1er problème, mais aucun d'entre eux résolu le mien.

Voici mes fichiers .java:

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; 

public Card(String name, String description, String mainImagePath, String secondaryImagePath) { 
    mName = name; 
    mDescription = description; 
    mMainImage = new Image(mainImagePath); 
    mSecondaryImage = 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; 
} 
} 
contrôleur

-> home.java:

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", 
     "/images/hit_main.jpg", "/images/hit_secondary.jpg");*/ 
// This is how I "hard-code" the object so that the 2nd issue does not occur 
    private Card goku = new Card("Goku SSJ3","Everlasting Legend", 
      "/images/gokussj3_main.jpg", "/images/gokussj3_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); 
     addCard(goku); 
    //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) -> { 
     Card currentlySelectedCard = listProperty.get(listView.getSelectionModel().getSelectedIndex()); 
     System.out.printf("ListView item clicked! Value retrieved: %s\n", currentlySelectedCard); 
     imageView.setImage(new Image(currentlySelectedCard.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!"); 
    Card currentlySelectedCard = listProperty.get(listView.getSelectionModel().getSelectedIndex()); 
    if (clickedAgain) { 
     imageView.setImage(new Image(currentlySelectedCard.getmMainImage().impl_getUrl())); 
     arrow.setRotate(180); 
     clickedAgain = false; 
    } else { 
     imageView.setImage(new Image(currentlySelectedCard.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 (int i = 0; i < testingList.size() - 1; i++) { 
      writer.printf("%s|%s|%s|%s\n", testingList.get(i).getName(), testingList.get(i).getDescription(), 
        testingList.get(i).getmMainImage().impl_getUrl(), testingList.get(i).getmSecondaryImage().impl_getUrl()); 
      System.out.println(testingList.get(i).toString()); 
     } 
    } catch (IOException ioe) { 
     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(); 
    } 
    int i = 0; 
    for (Card card : testingList) { 
     System.out.printf("%s loaded\n", testingList.get(i).toString()); 
     i++; 
    } 
    System.out.println("Loading Successful!"); 
} 

public void addCard(Card card) { 
    testingList.add(card); 
} 

// DEBUG purposes 
public void printTestingList() { 
    for (Card card : testingList) { 
     System.out.println(card.toString()); 
    } 
} 
} 

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{ 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/home.fxml")); 
    Parent root = loader.load(); 
    controller = loader.getController(); 
    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(); 
    } 
} 

//TODO:sp Fix when closisng the app-saving, the .txt file gets reseted 
@Override 
public void stop() { 
    System.out.println("App is closing!"); 
    // Saving before exiting 
    try { 
     controller.exportTo("CardsCollection.txt"); 
     System.out.println("Saving was successful!\n"); 
    } catch (NullPointerException npe) { 
     System.out.println("Problem saving file!"); 
     npe.printStackTrace(); 
    } 
    controller.printTestingList(); 
    // System.out.println(file.); 
} 

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

Eh bien d'abord de tout ce que je recommande d'écrire dans un fichier csv au lieu de juste un fichier txt simple car ils sont assez faciles à manipuler et presque la même chose. Il y a aussi des tonnes d'API que vous pouvez utiliser pour les fichiers csv. –

+0

@AlexanderHeim, j'ai créé un projet de test pour pouvoir utiliser un fichier csv mais le problème où tout ce qui est dans le fichier est supprimé après la fin du programme est toujours présent ... Je vais continuer à chercher mais si vous connaissez les causes ça me le fait savoir! Merci d'avance. EDIT: ce problème se produit lorsque j'écris une fois dans le fichier, puis je commente les lignes qui écrivent dans le fichier, ne laissant que le code pour la lecture. Est-ce que c'est faux? –

+0

Est-ce que le fichier est supprimé ou est-ce que le contenu disparaît? Eh bien, je ne commenterais pas les lignes qui écrivent dans le fichier. Essayez de diviser la lecture et l'écriture en différentes méthodes. Quelle API utilisez-vous? –

Répondre

0

Ceci fait partie d'un programme que j'ai écrit un cou il y a des mois PLE, essayez ces méthodes pour accéder à votre fichier csv:

// Writes to CSV File 
    private void writeCSV(ArrayList<String[]> newContent){ 

     CSVWriter writer; 

     try { 
      writer = new CSVWriter(new FileWriter(this.path), ';', CSVWriter.NO_QUOTE_CHARACTER); 
      writer.writeAll(newContent); 
      writer.flush(); 
      writer.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(CSVFile.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    // Reads from CSV File 
    private ArrayList<String> readCSV(){ 
     BufferedReader br = null; 
     String line = ""; 
     ArrayList<String> ret = new ArrayList(); 

     try { 

      br = new BufferedReader(new FileReader(this.path)); 
      while ((line = br.readLine()) != null) { 
       ret.add(line); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return ret; 
    } 

Il utilise pour l'écriture, la openCSV API et pour lire juste un BufferedReader normal (pas d'importations spéciales nécessaires). Le writeCSV() peut remplacer complètement le contenu d'un fichier .csv. Chaque chaîne [] représente une ligne et chaque élément de ce tableau une colonne pour cette ligne. Dans le cas où vous voulez juste modifier le contenu dans le fichier, vous devrez d'abord lire le fichier .CSV, puis modifier le ArrayList.

Remarque: readCSV() renvoie uniquement une ArrayList de chaînes, vous devez donc scinder la chaîne avec ";" afin d'avoir accès à chaque colonne.

J'espère thats pas trop confus ^^

0

Votre méthode addCard() ajoute à la liste sous-jacente, pas le ListProperty. Comme indiqué dans le documentation pour la méthode que vous utilisez pour créer la liste observable

Crée une nouvelle liste de tableau observable et ajoute une teneur collection col lui. En d'autres termes, une nouvelle liste est créée qui contient initialement les éléments de la liste fournie.

Les modifications ultérieures apportées à la collection que vous transmettez ne modifieront pas la liste observable.

Vous avez probablement juste besoin d'une seule liste observable ici: il n'y a pas besoin de créer une liste « simple » supplémentaire et pas besoin d'un ListProperty:

public class Home implements Initializable { 

    private Card goku = new Card("Goku SSJ3","Everlasting Legend", 
       "/images/gokussj3_main.jpg", "/images/gokussj3_secondary.jpg"); 

    private boolean clickedAgain = false; 

    @FXML 
    private Button arrowButton; 
    @FXML 
    private ImageView imageView; 

    @FXML 
    private ImageView arrow; 

    @FXML 
    private ListView listView; 

    private ObservableList<Card> cards = FXCollections.observableArrayList(); 


    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     addCard(goku); 

     listView.setItems(cards); 

     // Handle listView selection changes 
     listView.getSelectionModel().selectedItemProperty().addListener(((observable, oldCard, newCard) -> { 

      System.out.printf("ListView item clicked! Value retrieved: %s\n", newCard); 
      imageView.setImage(newCard.getmMainImage()); 
      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!"); 
     Card currentlySelectedCard = listView.getSelectionModel().getSelectedItem(); 
     if (clickedAgain) { 
      imageView.setImage(currentlySelectedCard.getmMainImage()); 
      arrow.setRotate(180); 
      clickedAgain = false; 
     } else { 
      imageView.setImage(currentlySelectedCard.getmSecondaryImage()); 
      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 : cards) { 
       // TODO should make image locations properties of card 
       // to implement this properly 
       writer.printf("%s|%s|%s|%s\n", card.getName(), card.getDescription(), 
         card.getmMainImage().impl_getUrl(), card.getmSecondaryImage().impl_getUrl()); 
       System.out.println(card.toString()); 
      } 
     } catch (IOException ioe) { 
      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(); 
     } 
     int i = 0; 
     for (Card card : testingList) { 
      System.out.printf("%s loaded\n", testingList.get(i).toString()); 
      i++; 
     } 
     System.out.println("Loading Successful!"); 
    } 

    public void addCard(Card card) { 
     cards.add(card); 
    } 

    // DEBUG purposes 
    public void printTestingList() { 
     for (Card card : cards) { 
      System.out.println(card.toString()); 
     } 
    } 

} 

Votre premier numéro est pas tout à fait clair pour moi . Si vous voulez dire que vous voulez ajouter des cartes au fichier existant lorsque vous enregistrez, vous devez remplacer

FileOutputStream fos = new FileOutputStream(fileName); 

avec

FileOutputStream fos = new FileOutputStream(fileName, true);